1

我正在尝试在运行时动态设置 DPI 感知级别(用于测试/调试目的)。

这在 Windows 8.0 上完美运行。dpiAware当我在清单中没有节点的情况下构建时,我可以通过SetProcessDPIAware在 WinMain 中尽早调用/跳过来控制它。我也可以通过在清单中的节点中指定true或来控制它。falsedpiAware

Windows 8.1 是另一回事。我可以PROCESS_SYSTEM_DPI_AWARE通过调用SetProcessDPIAwaretrue在清单中指定来获得,但我似乎无法获得PROCESS_DPI_UNAWARE

在清单中指定false似乎没有效果,并且 Process Explorer 将我的应用程序报告为 Per-Monitor 感知!

更奇怪的是,在正常工作时调用SetProcessDpiAwareness()不尊重PROCESS_DPI_UNAWARE参数PROCESS_SYSTEM_DPI_AWARE

一个仅链接到 kernel32 和 shcore 的简单示例应用程序将直接从PROCESS_DPI_UNAWAREto跳转,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

4

0 回答 0