我正在尝试在运行时动态设置 DPI 感知级别(用于测试/调试目的)。
这在 Windows 8.0 上完美运行。dpiAware
当我在清单中没有节点的情况下构建时,我可以通过SetProcessDPIAware
在 WinMain 中尽早调用/跳过来控制它。我也可以通过在清单中的节点中指定true
或来控制它。false
dpiAware
Windows 8.1 是另一回事。我可以PROCESS_SYSTEM_DPI_AWARE
通过调用SetProcessDPIAware
或true
在清单中指定来获得,但我似乎无法获得PROCESS_DPI_UNAWARE
!
在清单中指定false
似乎没有效果,并且 Process Explorer 将我的应用程序报告为 Per-Monitor 感知!
更奇怪的是,在正常工作时调用SetProcessDpiAwareness()
不尊重PROCESS_DPI_UNAWARE
参数PROCESS_SYSTEM_DPI_AWARE
。
一个仅链接到 kernel32 和 shcore 的简单示例应用程序将直接从PROCESS_DPI_UNAWARE
to跳转,PROCESS_PER_MONITOR_DPI_AWARE
即使参数为PROCESS_DPI_UNAWARE
:
... WinMain(...)
{
Sleep(1000*20); // Process Explorer reports me as Unaware at this point. (user32 is not loaded)
SetProcessDpiAwareness(PROCESS_DPI_UNAWARE);
Sleep(1000*20); // Process Explorer now reports me as Per-Monitor aware! (user32 is now loaded)
return 0;
}
SetProcessDpiAwareness 是 Windows 8.1 中的新功能,MSDN 只是说“可能的值来自 PROCESS_DPI_AWARENESS 枚举”。
在 Windows 8.1 中是否无法使用PROCESS_DPI_UNAWARE
和/或 dpiAware关闭 DPI 感知?false