18

I need to be able to set the dpiAware property in the manifest of my application to "per monitor". The available choices in the properties are just to enable or disable DPI awareness. Neither of these settings works for me. I can get the behavior I want for my application if I don't embed the manifest in the exe, then edit the manifest manually. I want to automatically generate and embed the manifest. Is there something I am missing? (I am using Visual Studio 2013.)

4

3 回答 3

20

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

为了完全启用 DPI 感知,使用最新的 Win10 支持(请参阅参考 URL 了解其他可能的选项),其中包括“ 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>

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

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

参考:Microsoft on DPI Awareness as the latest Windows 10 build(也有关于如何让您的代码具有 DPI 意识的教程,即使对于大型项目来说有点乏味)

于 2017-05-16T19:15:09.227 回答
17

此清单有效,并且<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>
于 2014-11-10T22:22:19.947 回答
13

在 Windows 10 1607 中引入了一个名为的新属性dpiAwareness。它允许选择备用 DPI 缩放选项并覆盖dpiAware属性(如果存在)。为获得最佳兼容性,应指定这两者,并确保您的应用程序适用于所有 DPI 感知级别。

以下清单在 Windows 10 1607+ 上启用每显示器 DPI 感知版本 2,在 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>

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

另请注意gdiScaling在 Windows 10 1607 中添加的属性。如果设置为 ,它将启用自动 GDI 缩放true。如果您的应用程序使用 GDI 进行绘图,这将非常有用。


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

于 2017-07-08T18:07:56.607 回答