我有一个 WIN32 SW,它的 UI 设计为 96 DPI,所以当用户将 Windows DPI 从 96 更改为 120 或更大时,UI 会出错。我想知道是否有 API 可以强制我的 SW 以 96DPI 显示 UI。
3 回答
从 Windows Vista 开始,DPI 的缩放应该自动发生。我没有任何直接经验知道它的工作原理,但这里是解释如何关闭它的页面:
http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx
您还可以为您的应用程序添加一个 appcompat 密钥。这个在注册表中的位置是:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
那是每个用户的设置,里面有相同的键HKEY_LOCAL_MACHINE
,但当然这是一个系统设置,需要提升的权限才能写入。像这样添加一个键:
"C:\path\to\app.exe"="HIGHDPIAWARE"
将为您的程序启用该兼容性标志,这将关闭 DPI 缩放。这适用于 Vista+。
根据文档, SetProcessDPIAware也是一种选择,但请注意存在竞争条件的危险。
没有 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;