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设置的影响 - 但确实如此.那么有没有更安全的方法来找出真正的,未缩放的屏幕分辨率?
在从 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)