我通过在清单文件中设置<dpiAware>True/PM</dpiAware>,使我的应用程序能够识别每个监视器的dpi。我可以使用process explorer验证这是否确实有效,或者调用GetProcessDpiAwareness。
这一切都运行得很好,我可以在我的代码中很好地缩放客户端区中的任何内容。然而,我唯一的问题是,如果我将我的应用程序从系统dpi监视器拖到非系统dpi监视器上,标题栏和任何系统菜单都会变得太大或太小。这不是大多数内置应用程序的情况(例如calc、edge browser等)。因此,必须有适当的扩展。有人知道微软的开发人员是怎么做到这一点的吗?
下面的截图应该能更好地解释我的问题。还要注意,close、min和max按钮之间的填充在缩放时是不同的(96dpi)。

Sample app我附加了一个非常简单的应用程序,这是每个显示器的dpi感知。
发布于 2016-08-03 03:52:56
更新:
在清单中添加新的<dpiAwarness>声明就足以解决所有这些问题。here就是一个例子。
以前调查的残留物(过时):
对这个问题进行更多的调查。
系统设置:两个显示器,一个是96 dpi,另一个是267 dpi (Microsoft Surface 4)。
测试窗口移至辅助96 dpi显示器:
下面是在清单中使用<dpiAware>true/pm</dpiAware>进行渲染(错误,IMO):

注意标题栏的巨大尺寸和错误的窗口图标大小。
下面是使用<dpiAware>true</dpiAware>进行的正确渲染

我怀疑MSDN文档对PROCESS_DPI_AWARENESS的价值有明显的误导性。我看不出<dpiAware>true</dpiAware>和<dpiAware>true/pm</dpiAware>在消息和样式上有什么不同。后者只是让标题变得更大。在这两种情况下,应用程序在具有不同DPI的监视器之间移动时都会收到WM_DPICHANGED消息。
叹一口气。
https://stackoverflow.com/questions/31781767
复制相似问题