3

我有一个 WIN32 SW,它的 UI 设计为 96 DPI,所以当用户将 Windows DPI 从 96 更改为 120 或更大时,UI 会出错。我想知道是否有 API 可以强制我的 SW 以 96DPI 显示 UI。

4

3 回答 3

2

从 Windows Vista 开始,DPI 的缩放应该自动发生。我没有任何直接经验知道它的工作原理,但这里是解释如何关闭它的页面:

http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx

于 2009-02-21T06:37:26.597 回答
2

您还可以为您的应用程序添加一个 appcompat 密钥。这个在注册表中的位置是:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

那是每个用户的设置,里面有相同的键HKEY_LOCAL_MACHINE,但当然这是一个系统设置,需要提升的权限才能写入。像这样添加一个键:

"C:\path\to\app.exe"="HIGHDPIAWARE"

将为您的程序启用该兼容性标志,这将关闭 DPI 缩放。这适用于 Vista+。

根据文档, SetProcessDPIAware也是一种选择,但请注意存在竞争条件的危险。

于 2009-02-21T06:58:23.583 回答
1

没有 API 可以强制您的应用以 96DPI 显示。DPI 是一种设备设置,不能按应用程序进行控制。

如果您可以更改程序,则可以缩放 UI 以在高 DPI 上正常显示。你需要打电话GetDeviceCaps;更具体地说,您需要使用 和 返回的数字来计算 X 和 YLOGPIXELSX比例LOGPIXELSY。像这样的东西:

HDC hdc;
double m_dDPIScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0;
double m_dDPIScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0;
于 2009-02-21T04:42:49.260 回答