c – SetProcessDPIAware似乎无法在Windows 10下运行

c – SetProcessDPIAware似乎无法在Windows 10下运行,第1张

概述我试图在 Windows C应用程序中获得真正的屏幕分辨率(以像素为单位).当Windows dpi设置改变时,我得到虚拟(调整)分辨率而不是真实分辨率.我尝试使用SetProcessDPIAware,SetProcessDpiAwareness(所有三个枚举值作为参数)和清单中的真实设置.在所有三种情况下,代码在我的Windows 7 PC中工作正常(即显示真实分辨率)但在Win 10中没有(这 我试图在 Windows C应用程序中获得真正的屏幕分辨率(以像素为单位).当windows dpi设置改变时,我得到虚拟(调整)分辨率而不是真实分辨率.我尝试使用SetProcessDPIAware,SetProcessDpiAwareness(所有三个枚举值作为参数)和清单中的真实设置.在所有三种情况下,代码在我的windows 7 PC中工作正常(即显示真实分辨率)但在Win 10中没有(这里它忽略了DPI Aware设置并返回调整后的分辨率).
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from windows headers// windows header files:#include <windows.h>#include <winuser.h>#include <VersionHelpers.h>#include <ShellScalingAPI.h>#include <stdlib.h>#include <stdio.h>int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdline,int       nCmdshow){char *cBuffer2 ;  cBuffer2 = (char *)malloc(3000) ;  if (IswindowsVistaOrGreater())  {//    SetProcessDpiAwareness(PROCESS_SYstem_DPI_AWARE);      int result = SetProcessDPIAware();      sprintf(cBuffer2,"SetProcessDPIAware() result: [%i]\n",result) ;      int height = GetSystemMetrics(SM_CYSCREEN);      int wIDth = GetSystemMetrics(SM_CXSCREEN);      sprintf(cBuffer2,"%s#1:\nHeight: [%i]\nwIDth: [%i]\n",cBuffer2,height,wIDth) ;      HWND hwnd = (HWND)atoi(lpCmdline) ;      HMONITOR monitor = MonitorFromWindow(hwnd,MONITOR_DEFAulTTONEAREST);      MONITORINFO info;      info.cbSize = sizeof(MONITORINFO);      GetMonitorInfo(monitor,&info);      int monitor_wIDth = info.rcMonitor.right - info.rcMonitor.left;      int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;      sprintf(cBuffer2,"%s#2:\nHeight: [%i]\nwIDth: [%i]\n",monitor_height,monitor_wIDth) ;  }  MessageBox(0,"SHOWRES.EXE",MB_OK) ;  return 0 ;}

我尝试使用的清单如下:

<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>

有任何想法吗?

解决方法 在Jonathan Potter和barmak Shemirani的帮助下,我终于发现了正在发生的事情:windows 10与先前版本的windows不同,允许用户“即时”更改dpi设置,而无需注销并再次登录.我在win 10机器上运行测试,通常具有标准(100%)设置.所以我会将设置更改为150%,运行应用程序并得到错误的结果.

Jonathan和barmak的回答表明,特定PC的设置中有一些东西,而不是程序或一般的胜利10,这导致了我的问题.所以我尝试了以下方法:

- changed DPI settings to 150%- logged out- logged in again- ran the program

我得到了正确的结果(真正的屏幕分辨率,与调整后的一个).

因此,为了使SetProcessDPIAware(以及相关方法:SetProcessDpiAwareness()和manifest with true)正常工作,必须在更改DPI设置之后和运行程序之前注销并再次登录.

再次感谢Jonathan和barmak!

总结

以上是内存溢出为你收集整理的c – SetProcessDPIAware似乎无法在Windows 10下运行全部内容,希望文章能够帮你解决c – SetProcessDPIAware似乎无法在Windows 10下运行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257852.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存