11

我遇到了一个有趣的问题。至少在 Vista 中,当桌面 DPI 设置未设置为 100% 时,getSystemMetrics(SM_CXSCREEN) 返回的值不正确。例如,我在 1366x768 屏幕中尝试了 150%,getSystemMetrics() 返回 911 而不是 1366(和 1366 / 1.5 ~ 911)

根据 MSDN,getSystemMetrics(SM_CXSCREEN) 返回像素,所以我认为这个值不会受到 DPI 设置的影响——但确实如此。那么有没有更安全的方法来找出真实的、未缩放的屏幕分辨率?

4

3 回答 3

11

当超过 125% 时,程序必须告诉操作系统它可以识别 DPI,才能获得真正的分辨率。最好使用清单来完成,如此MSDN 库文章中所述

于 2010-04-13T14:53:09.497 回答
6

To make you application aware of dpi make and manifest file and put the following text in it.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
于 2011-06-19T01:36:48.590 回答
2

在从 GetSystemMetrics 或 GetClientRect 等函数获取正确的像素指标之前,您的应用程序必须向操作系统声明它知道 DPI,因此不会搞砸一切。

对此的推荐方式进行了一些更改。有关更多详细信息,请参阅 MSDN 文档。

从 Windows 10 开始:

::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

或者从 Windows 8.1 开始:

::SetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

或者从 Vista 开始:

::SetProcessDPIAware();

调用此函数后,GetSystemMetrics 等函数应以像素为单位向您的应用返回正确的值。

于 2016-12-15T08:31:18.740 回答