SetCursorPos https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setcursorpos将光标移动到指定的屏幕坐标。然而,它似乎有一个错误:如果光标从主显示屏移动到第二个显示屏,并且新的 Y 坐标位于主显示屏的 Y 范围之外,光标的 X 坐标重置为第二个显示屏的左侧!该错误如下图所示:
在这里,主显示器 1 位于左侧,辅助显示器 2 位于右侧。三个使用示例SetCursorPos
所示,其中光标从主显示器 1 移动到辅助显示器 2。
在例子中b
, SetCursorPos
按预期工作。然而,在示例中a
and c
,我们尝试将光标移动到bug area显示器 2 的显示,以红色阴影显示。然后光标位置重置到显示屏 2 的左侧(显示为黄色阴影)!
这是重现该错误的最短程序:
#include <windows.h>
int main() {
POINT origPoint;
GetCursorPos(&origPoint);
SetCursorPos(origPoint.x + 200, origPoint.y + 200);
}
该程序将光标沿对角线向下和向右移动 200 个屏幕坐标。按照示例的方式使用c
图中:将光标放在显示屏1的右下角,然后运行程序。您会发现光标移至显示屏 2 的左侧。
一些注意事项:
- 此错误的解决方法是调用
SetCursorPos
两次。第一次调用至少将光标移动到正确的显示位置。在第二次调用时,错误不会发生,因为它没有跨显示器移动。但是,就我而言,我无法轻松更改调用该网站的网站。
- 我知道ClipCursor https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-clipcursor,但这不是行为的原因。
GetClipCursor
报告一个包含整个虚拟屏幕的矩形(如GetSystemMetrics(SM_XVIRTUALSCREEN)
ETC)。甚至与ClipCursor(NULL)
,错误仍然发生。此外,上面的双重调用解决方法反驳了这个假设。
-
SetCursorPos
声称成功(返回1
),无论是否存在此错误。 (为简洁起见,省略了上面的错误检查。)
- 替代方案
SetCursorPos
is SendInput https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput,通过一个MOUSEINPUT https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-mouseinput包含“标准化绝对坐标”。但这个方法也受到完全相同的错误的影响!
- 另一种替代方案
SetCursorPos
is mouse_event https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event,传递标准化绝对坐标。此方法也受到完全相同的错误的影响!
- 我运行的是 Windows 10,版本 20H2,内部版本 19042.085。
我的思维模式有缺陷吗?是否存在我不知道的其他光标移动限制或特殊情况?或者我应该将此报告为 Windows bug?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)