如何在Windows应用程序清单中将dpiAware属性设置为Visual Studio中的"每个监视器"?

Way*_*yne 15 manifest dpi highdpi visual-studio-2013 hidpi

我需要能够将应用程序清单中的dpiAware属性设置为"每个监视器".属性中的可用选项仅用于启用或禁用DPI感知.这些设置都不适合我.如果我没有在exe中嵌入清单,那么我可以获得我想要的应用程序行为,然后手动编辑清单.我想自动生成并嵌入清单.有什么我想念的吗?(我使用的是Visual Studio 2013.)

dya*_*sta 17

Windows 10中的新功能是dpiAwarenessdpiAware,因此我们需要稍微更新这个示例.现在,它很好,因为如果dpiAwareness不存在,那么设置将从dpiAware继承.

要完全启用DPI感知,请使用最新的Win10支持(请参阅参考URL以了解其他可能的选项),其中包括" permonitor "和" permonitorv2 ",我将使用它而不是"system",因为您的问题会询问.

<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>
Run Code Online (Sandbox Code Playgroud)

禁用,你会做相反的事情(不需要,dpiAwareness因为我们不支持它):

<asmv3:application>
  <asmv3:windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">unaware</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>
Run Code Online (Sandbox Code Playgroud)

如果您碰巧使用GDI对象绘制一些自己的东西,那么甚至还有'gdiScaling'.

<asmv3:application>
  <asmv3:windowsSettings>
    <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>
  </asmv3:windowsSettings>
</asmv3:application>
Run Code Online (Sandbox Code Playgroud)

参考:Microsoft on DPI Awareness,作为最新的Windows 10版本(也有关于如何使代码DPI识别的教程,即使对于大型项目来说有点乏味)


War*_* P 16

这个清单起作用,<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>
Run Code Online (Sandbox Code Playgroud)

  • 在VS 2013中,您不需要UAC元素,因为会自动添加UAC元素,而dpiAware元素也是如此。您只需要兼容性GUID。请注意,此示例仅列出Windows 8.1 GUID。请参阅[此博客文章](https://blogs.msdn.microsoft.com/chuckw/2013/09/10/manifest-madness/) (2认同)

tam*_*bre 10

在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</dpiAwareness> <!-- adding v1 as fallback would result in v2 not being applied to dialogs on capable systems -->
            <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling> <!-- enables GDI DPI scaling -->
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>
Run Code Online (Sandbox Code Playgroud)

要禁用DPI感知,您可以简单地保留DPI-awareness(默认为不知道),或指定dpiAwarefalse.

另请注意该gdiScaling属性,该属性已添加到Windows 10 1607.如果设置为,则启用自动GDI缩放true.如果您的应用程序使用GDI进行绘制,那么它非常有用.


参考:
自Windows 10 1607以来的高DPI扩展
编写DPI感知应用程序应用
程序清单