我需要能够将应用程序清单中的dpiAware属性设置为"每个监视器"。属性中的可用选项仅用于启用或禁用DPI感知。这些设置都不适合我。如果我没有在清单中嵌入清单,那么我可以获得我想要的应用程序行为,然后手动编辑清单。我想自动生成并嵌入清单。有什么我想念的吗? (我正在使用Visual Studio 2013.)
答案 0 :(得分:13)
此清单有效,<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>
答案 1 :(得分:13)
Windows 10中的新功能 dpiAwareness 以及 dpiAware ,因此我们需要稍微更新此示例。现在,它很好,因为如果 dpiAwareness 不存在,那么设置将继承自 dpiAware 。
要完整启用DPI感知功能,请使用最新的Win10支持(请参阅其他可能选项的参考URL),其中包括&#39; permonitor &#39;和&#39; permonitorv2 &#39;,我将使用而不是&#39; system&#39;因为你的问题是这样的。
<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>
然后甚至有&#39; gdiScaling&#39;如果您碰巧使用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的教程,即使对于大型项目来说有点乏味)
答案 2 :(得分:7)
在Windows 10 1607中引入了名为dpiAwareness
的新属性。它允许选择回退DPI缩放选项并覆盖dpiAware
属性(如果存在)。为了获得最佳兼容性,应指定这两者,并确保您的应用程序适用于所有DPI感知级别。
以下清单启用Windows 10 1607+上的每个监视器DPI感知版本2,Windows 8.1+上的每个监视器DPI感知和Windows 7上的系统DPI感知:
<?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感知(默认情况下不知道),或将dpiAware
指定为false
。
另请注意{10}中添加的gdiScaling
属性。如果设置为true
,则会启用自动GDI缩放。如果您的应用程序使用GDI进行绘制,那么它非常有用。
<强>参考文献:强>
High-DPI scaling since Windows 10 1607
Writing DPI-aware applications
Application manifests