【发布时间】: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 清单在新的操作系统版本中工作并在旧的操作系统版本中被忽略,但我不打算用我的头撞到那堵墙。
-
这很奇怪。我在我的一个应用程序的清单文件中使用
<dpiAware>true</dpiAware>,它在 Windows 2000 上一直运行良好。当然,这是一个本机 C++ 应用程序,而不是 .NET WinForms,所以我想它是 .NET Framework那是读取清单文件信息并抛出错误。 (我没有检查 Windows 事件日志以查看是否记录了某些内容。可能是。我不太在意;应用程序运行文件。)
标签: winforms manifest windows-server-2003 dpi