需要 dpiAware 可执行文件才能在 Windows XP/2003 中工作

Posted

技术标签:

【中文标题】需要 dpiAware 可执行文件才能在 Windows XP/2003 中工作【英文标题】:Need dpiAware executable to work in Windows XP/2003 【发布时间】:2013-02-12 08:00:48 【问题描述】:

我有一些 Windows 窗体应用程序需要在 XP/2003/Vista/7/2008/8/2012 上运行,并且当用户选择大字体或更高 DPI 时应该仍然看起来不错。在 app.manifest 中启用 DPI 感知适用于 Vista 及更高版本,但在 XP/2003 上,由于清单条目不受支持,应用程序会报告错误。

<?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">
  <asmv1:application>
    <asmv1:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv1:windowsSettings>
  </asmv1:application>
</asmv1:assembly>

在 Windows 2003 上使用该清单运行应用程序会导致以下错误消息:

This application has failed to start because the application
configuration is incorrect.

并记录此 Windows 事件消息:

The element asmv1:application appears as a child of element
urn:schemas-microsoft-com:asm.v1^assembly which is not supported
by this version of Windows.

是否可以以允许 XP/2003 忽略它们不支持的这部分清单的方式声明清单?或者我必须删除清单并对 SetProcessDPIAware 进行有条件的调用(即使我读过的所有内容都建议不要使用该 API 函数)?

【问题讨论】:

没有。支持十多年前的操作系统确实是一个有损的提议。您不必担心 SetProcessDPIAware 可能导致的初始化竞争问题,即时编译器有助于避免该陷阱。只需在您的 Main() 方法中调用它即可。 世界上还有很多 Windows XP 和 Server 2003,所以它就是这样。 SetProcessDPIAware 工作正常。我希望有一种方法可以使 dpiAware 清单在新的操作系统版本中工作并在旧的操作系统版本中被忽略,但我不打算用我的头撞到那堵墙。 这很奇怪。我在我的一个应用程序的清单文件中使用&lt;dpiAware&gt;true&lt;/dpiAware&gt;,它在 Windows 2000 上一直运行良好。当然,这是一个本机 C++ 应用程序,而不是 .NET WinForms,所以我想它是 .NET Framework那是读取清单文件信息并抛出错误。 (我没有检查 Windows 事件日志以查看是否记录了某些内容。可能是。我不太在意;应用程序运行文件。) 【参考方案1】:

我最终得到了这个清单

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
  <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>
</assembly>

Delphi 特定条件:使用运行时主题已关闭且 xpman.pas 未在任何地方使用

【讨论】:

以上是关于需要 dpiAware 可执行文件才能在 Windows XP/2003 中工作的主要内容,如果未能解决你的问题,请参考以下文章

我是否需要特殊许可才能分发使用mkbundle编译的Mono可执行文件?

在 C# 中确定可执行文件是 64 位还是 32 位 [重复]

wind能帮忙加工数据吗

如何在linux平台将python封装成exe文件,我用cxfreeze试过,生成了linux下的可执行文件,无法生成exe文件

Linux指令

exe4j高dpi设置