GetSystemMetrics()为SM_CXSCREEN返回错误的值

gga*_*ett 9 winapi dpi screen-resolution

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

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

Han*_*ant 10

当你超过125%时,程序必须告诉操作系统它具有DPI感知能力才能获得真正的分辨率.这最好用清单完成,如本MSDN Library文章中所述.


Tob*_*arp 7

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

其建议方式发生了一些变化。有关更多详细信息,请参阅 MSDN 文档。

从 Windows 10 开始:

::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);
Run Code Online (Sandbox Code Playgroud)

或者从 Windows 8.1 开始:

::SetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);
Run Code Online (Sandbox Code Playgroud)

或者从 Vista 开始:

::SetProcessDPIAware();
Run Code Online (Sandbox Code Playgroud)

调用此函数后,函数 GetSystemMetrics 等应将正确的值返回到您的应用程序(以像素为单位)。


小智 5

使应用程序知道dpi make和manifest文件,并在其中放入以下文本.

<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>
Run Code Online (Sandbox Code Playgroud)