在Windows 10中,GetWindowRect存在偏移问题

4
我在我的程序中使用GetWindowRect来获取桌面上窗口的坐标。在我这里测试了十几台电脑(XP-W8.1),都能正常工作。但是在我的一台W10触摸屏电脑上存在一个偏移量的问题。我已经通过Google查找了Windows 10的错误和与显示器相关的问题,但没有找到任何信息。然而,这似乎是一个常用的函数,并且问题很容易复现。
有人有任何线索吗?
简化后的代码:
hwnd = FindWindow(NULL, windowname);
if (hwnd) {
  TRect r;
  GetWindowRect(hwnd, &r);
}
HWND hdt = GetDesktopWindow();
HDC dcdt = GetWindowDC(hdt);
// bitblt canvas to get window (won't work for high DPI setting)

1
如果这很容易复现,请向我们展示您的复现代码,您期望看到的值,您观察到的值以及您应用程序的 DPI 感知设置。 - David Heffernan
GetWindowRect 使用像素,这是否意味着 DPI 不相关? - Mike Versteeg
2
支持XP-10很容易。您只需添加DPI感知清单,并在代码中支持高DPI即可。 - David Heffernan
1
@MikeVersteeg:只要稍加努力,C++Builder几乎可以完成任何事情。您可以访问完整的Win32 API,并且可以通过IDE(在较新版本中直接)或通过旧版本中的.RC文件将清单添加到C++Builder项目中。 - Remy Lebeau
1
有关嵌入式清单的详细信息,请参见Manifest Madness。它只是作为Win32资源插入的XML文本文件,因此并非“魔法”。 - Chuck Walbourn
显示剩余4条评论
1个回答

4

您的程序不具备DPI感知能力,因此受到DPI虚拟化的影响。这意味着诸如GetWindowRect等函数返回的坐标将是虚拟坐标,因此与真实屏幕坐标不匹配。


2
这也意味着它不仅适用于Windows 10,而且在高DPI显示屏上可以发生在任何版本,从Vista开始。 - Adrian McCarthy
1
感谢大家!在这里我学到了两件新的事情,非常感激你们的支持(以及 Stack Overflow)。 - Mike Versteeg
请注意,除了 DPI 感知之外,GetWindowRect() 可能会给出错误结果的其他原因。Windows 在所有顶级窗口周围绘制一个阴影边框,可能是左侧、底部和右侧的 2 像素或 7 像素。如何解决,请参见:https://dev59.com/2VsX5IYBdhLWcg3wLc6J - Elmue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接