以编程方式确定Windows DPI设置?

hum*_*mba 3 c++ mfc dpi highdpi windows-7

我们的一个非dpi感知MFC应用程序出了问题.
如果将系统设置更改为高dpi(例如120或144 dpi),则任务栏上的应用程序图标会变得紧张.不幸的是,我们必须WNDCLASS为大型机注册我们自己的,并且在WNDCLASS.hIcon成员中你必须设置一个图标.使用该LoadIcon功能加载此图标.并且该函数尝试以标准大小加载图像(与返回相同GetSystemMetrics(SM_CXICON)),120dpi为40x40像素.这很不幸,因为我们没有提供这种尺寸的图标.但是有一个解决方法:从奇怪的是,dpi虚拟化似乎没有生效120 dpi,GetDeviceCaps(..., LOGPIXELSX)确实返回120 dpi和GetSystemMetrics(SM_CXICON)返回40.所以我们可以捕获它,只需加载不同大小的图标.但是对于144 dpi它不起作用,因为现在虚拟化似乎生效,我们得到96 dpi和32像素,这再次导致图标看起来非常难看.
我发现如果我只是将WNDCLASS.hIcon成员设置为NULL,则图标显示正常.但是我想知道是否可以,因为根据MSDN:

hIcon
处理类图标.该成员必须是图标资源的句柄.如果此成员为NULL,则系统提供默认图标.

即使我将该成员设置为NULL,我也能依靠显示总是向上的图标吗?另一种方法是以正确的大小加载图标,但为此我必须知道系统实际上设置为144 dpi.在那里,我们处于初步问题.有谁知道是否可以确定系统的DPI设置(来自dpi虚拟化应用程序)?请注意,我还想过做一些脏事,比如有一个dpi识别应用程序告诉我实际的dpi和类似的东西,但我想避免这样的事情,如果可能的话.

最好的祝福,

humbagumba

更新:
我发现将WNDCLASS.hIcon成员设置NULL为不是一个好主意,因为大型图标被替换为默认图标(即使它在任务栏上看起来很好......) - 我没注意到我的第一次考试.

Han*_*ant 5

您必须向程序添加清单(或编辑现有清单)才能关闭DPI虚拟化.它应该如下所示:

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

这不太可能导致几个新问题.本MSDN Library文章中非常清楚了解您想要了解的所有内容.