2014-05-08 27 views
4

我需要能夠將我的應用程序的清單中的dpiAware屬性設置爲「每個顯示器」。屬性中的可用選項僅用於啓用或禁用DPI認知。這些設置都不適用於我。如果我不在exe中嵌入清單,則可以獲得我想要的應用程序的行爲,然後手動編輯清單。我想自動生成並嵌入清單。有什麼我失蹤? (我使用Visual Studio 2013年)如何在Visual Studio中將Windows應用程序清單中的dpiAware屬性設置爲「每個顯示器」?

回答

8

此清單作品,<dpiAware>True/PM</dpiAware>是最重要的部分:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
     <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> 
    </application> 
    </compatibility> 

    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 
    <asmv3:windowsSettings 
     xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>True/PM</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 

</asmv1:assembly> 
+0

隨着VS 2013,你不需要UAC的要素標註被自動添加,因爲是''dpiAware''元素。您只需要兼容性GUID。請注意,此示例僅列出Windows 8.1 GUID。請參閱[本博客文章](https://blogs.msdn.microsoft.com/chuckw/2013/09/10/manifest-madness/) –

5

新在Windows 10是dpiAwareness以及dpiAware,所以我們需要稍微更新這個例子。現在,它是好的,因爲如果dpiAwareness不存在,那麼設置將從dpiAware繼承。

要啓用DPI意識十足,與最新的Win10支持(見參考文獻網址爲其他可能的選項),其中包括「permonitor」和「permonitorv2」,我會用,而不是「系統」,因爲你的問題提出問題。

<asmv3:application> 
    <asmv3:windowsSettings> 
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- legacy --> 
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to pm if pmv2 is not available --> 
    </asmv3:windowsSettings> 
</asmv3:application> 

禁用,你會做相反的(不需要dpiAwareness因爲我們不支持它):

<asmv3:application> 
    <asmv3:windowsSettings> 
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">unaware</dpiAware> 
    </asmv3:windowsSettings> 
</asmv3:application> 

然後甚至有 'gdiScaling' 如果你恰巧使用GDI對象來繪製一些你自己的東西。

<asmv3:application> 
    <asmv3:windowsSettings> 
    <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> 
    </asmv3:windowsSettings> 
</asmv3:application> 

參考:Microsoft on DPI Awareness as of latest Windows 10 build(也有關於如何使你的代碼DPI知道教程,即使是在大的項目有點乏味)

+0

感謝您的編輯IInspectable,我從一些不良的清單中剔除了我顯然,躺在身邊。謹慎對待任何用戶的一句話:如果你得到的錯誤是明顯的,那麼你的字面意思就是你的應用程序不能以'並行配置錯誤'運行。 –

2

在Windows 10 1607引入了一個名爲dpiAwareness新屬性。它允許選擇回退DPI縮放選項並覆蓋dpiAware屬性(如果存在)。爲了達到最佳兼容性,您應該指定這兩者,並確保您的應用程序能夠使用所有DPI認知級別。

以下清單能夠在Windows 10 1607+每監視器DPI意識版本2,每個監視器DPI意識在Windows 8.1+和系統DPI意識在Windows 7:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 
    <assemblyIdentity type="win32" name="MyApplication" version="1.0.0.0" processorArchitecture="amd64"/> 

    <asmv3:application> 
     <asmv3:windowsSettings> 
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 --> 
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported --> 
      <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> <!-- enables GDI DPI scaling --> 
     </asmv3:windowsSettings> 
    </asmv3:application> 
</assembly> 

要禁用DPI感知,您可以簡單地保持DPI感知未指定(默認情況下不知道),或指定dpiAwarefalse

另請注意gdiScaling屬性,該屬性在Windows 10 1607中添加。如果設置爲true,它將啓用自動GDI縮放。如果您的應用程序使用GDI繪圖,這非常有用。


參考文獻:
High-DPI scaling since Windows 10 1607
Writing DPI-aware applications
Application manifests

+0

謝謝。在屏幕上移動時,GDI Scaling似乎會影響dialogex的拖動框的大小。需要更多研究! –

相關問題