如何使用我自己的清单文件并将其嵌入到使用 Visual Studio 2017 的可执行文件中?
How to use my own manifest file and embed it into executable using Visual Studio 2017?
我正在尝试使用 PerMonitorV2 DPI 感知,它会在 DPI 更改时调整非客户区的大小。 MSDN 文档推荐使用 manifest 来设置 DPI 感知模式:
Setting the default DPI awareness for a process.
VS 配置属性的清单工具部分仅提供三个 DPI 感知选项:None(未感知)、高 DPI 感知,和 Per Monitor DPI Aware(这似乎是 PerMonitorV1),所以我需要找到一些方法来覆盖这些 DPI 设置,但我不知道该怎么做。 (我最好的猜测是以某种方式提供我自己的清单文件,而不是依赖 Visual Studio 来生成一个。)
在清单工具设置中,您可以定义一个额外的清单片段,Visual Studio 它将与默认片段合并。默认清单仍将提供 <dpiAware>
标签,作为不理解 <dpiAwareness>
标签的旧版本 OS 的回退。
步骤:
- 打开项目配置,select "Manifest Tool" > "Input and Output".
在字段 "Additional Manifest Files" 中,输入您要包含的清单片段的文件名。该路径是相对于您的项目文件夹的。
片段看起来像这样。请注意,我 从 MSDN sample:
中删除了 <dpiAware>
标签
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
</assembly>
来自 "DPI Awareness" 组合框 select "High DPI Aware"。如上所述,这是旧 Windows 版本的后备值。
结果:
这是我使用应用程序向导创建的 Win32 项目的合并清单。它嵌入在应用程序的资源中。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
</assembly>
如果您获得两个 <dpiAware>
标签,您忘记从清单片段中删除 <dpiAware>
。
我正在尝试使用 PerMonitorV2 DPI 感知,它会在 DPI 更改时调整非客户区的大小。 MSDN 文档推荐使用 manifest 来设置 DPI 感知模式: Setting the default DPI awareness for a process.
VS 配置属性的清单工具部分仅提供三个 DPI 感知选项:None(未感知)、高 DPI 感知,和 Per Monitor DPI Aware(这似乎是 PerMonitorV1),所以我需要找到一些方法来覆盖这些 DPI 设置,但我不知道该怎么做。 (我最好的猜测是以某种方式提供我自己的清单文件,而不是依赖 Visual Studio 来生成一个。)
在清单工具设置中,您可以定义一个额外的清单片段,Visual Studio 它将与默认片段合并。默认清单仍将提供 <dpiAware>
标签,作为不理解 <dpiAwareness>
标签的旧版本 OS 的回退。
步骤:
- 打开项目配置,select "Manifest Tool" > "Input and Output".
在字段 "Additional Manifest Files" 中,输入您要包含的清单片段的文件名。该路径是相对于您的项目文件夹的。
片段看起来像这样。请注意,我 从 MSDN sample:
中删除了<dpiAware>
标签<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> </windowsSettings> </application> </assembly>
来自 "DPI Awareness" 组合框 select "High DPI Aware"。如上所述,这是旧 Windows 版本的后备值。
结果:
这是我使用应用程序向导创建的 Win32 项目的合并清单。它嵌入在应用程序的资源中。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</windowsSettings>
</application>
</assembly>
如果您获得两个 <dpiAware>
标签,您忘记从清单片段中删除 <dpiAware>
。