【发布时间】:2011-12-25 00:10:36
【问题描述】:
我正在制作应用程序 DPI Aware,但我需要对来自其他应用程序的 HWND 执行GetWindowRect。我的问题是这在也支持 DPI 感知的应用程序上运行良好,但我如何检测 HWND 句柄是否是 DPI 虚拟化的,例如缩放所以我可以自己缩放它?或者是否有其他我错过的 API 可以让我以 DPI 感知方式从另一个进程的 HWND 获得窗口大小?
我尝试了LogicalToPhysicalPoint,但似乎总是失败,可能是因为 HWND 不属于我的应用程序。
【问题讨论】:
-
我很难相信
GetWindowRect返回的值取决于其他应用程序是否被虚拟化。真的是这样吗?你要的是顶层窗口还是子窗口的矩形?你用这个矩形做什么? -
其实是我自己解决的,我必须以 DWMWA_EXTENDED_FRAME_BOUNDS 作为参数调用 DwmGetWindowAttribute。是的,它的行为确实像这样,很容易复制,创建一个 DPI 感知应用程序,将您的 DPI 设置为 >144 并尝试它。我想在某种意义上这样做是有意义的,因为虚拟化的窗口没有意识到它正在被虚拟化,并且大多数值来自窗口所属进程的上下文。
-
我认为这个问题应该重新打开——我不同意关闭的原因。截至目前,戴尔开始出货具有高 dpi 显示器的新戴尔 XPS 机器。这使得这个问题与许多在 Windows 上编写代码的开发人员相关。一旦您开始在 Windows 上使用高 dpi 显示器,大多数应用程序看起来都很糟糕。社区对这一地区的投入越多,我们就能越快通过这个新的雷区。
标签: windows winapi visual-c++