Winapi GetWindowRect在Windows 10中具有偏移量

Winapi GetWindowRect在Windows 10中具有偏移量,winapi,c++builder,windows-10,Winapi,C++builder,Windows 10,我在程序中使用GetWindowRect获取桌面上窗口的坐标。这在我这里测试的十几台电脑(XP-W8.1)上运行良好,但在我的一台带有触摸屏的W10电脑上却不行:坐标在左上角有一个偏移。我在谷歌上搜索了Windows10中的一个bug和一些与显示器相关的东西,但找不到任何东西,然而这似乎是一个常用的函数,问题很容易重现 有人找到线索了吗 代码,简化: hwnd = FindWindow(NULL, windowname); if (hwnd) { TRect r; GetWindowRe

我在程序中使用GetWindowRect获取桌面上窗口的坐标。这在我这里测试的十几台电脑(XP-W8.1)上运行良好,但在我的一台带有触摸屏的W10电脑上却不行:坐标在左上角有一个偏移。我在谷歌上搜索了Windows10中的一个bug和一些与显示器相关的东西,但找不到任何东西,然而这似乎是一个常用的函数,问题很容易重现

有人找到线索了吗

代码,简化:

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)

您的程序不支持DPI,因此需要进行DPI虚拟化。这意味着像
GetWindowRect
这样的函数返回的坐标将是虚拟坐标,因此与真实屏幕坐标不匹配。

如果这很容易复制,请向我们显示您的复制代码、您希望看到的值、您观察到的值,您的应用程序DPI感知设置GetWindowRect与像素一起工作,这难道不意味着DPI不相关吗?支持XP-10很容易。您只需添加DPI感知清单,并在代码中支持高DPI。@MikeVersteeg:在C++Builder中,只要稍加努力,几乎可以完成任何事情。您可以访问完整的Win32 API,并且可以直接通过较新版本的IDE或较旧版本的
.RC
文件向C++Builder项目添加清单。有关嵌入清单的详细信息,请参阅。它只是一个作为Win32资源插入的XML文本文件,所以它不是“魔法”。这也意味着它不是Windows 10特有的,但只要有足够高的DPI显示,它可以在返回Vista的任何版本上发生。谢谢大家!我在这里学到了两个新东西,非常高兴得到您的支持(等等)。请注意,除了DPI意识之外,GetWindowRect()可能给出错误结果还有其他原因。Windows在所有顶级窗口的周围绘制阴影边框,其左、下和右可能为2像素或7像素。如何解决此问题请参见: