c++ - 为什么 SetCursorPos 会将光标位置重置到显示屏的左侧?
问题描述
SetCursorPos
将光标移动到指定的屏幕坐标。但是,它似乎有一个错误:如果光标从主显示器移动到第二显示器,并且新的 Y 坐标在主显示器的 Y 范围之外,则光标的 X 坐标会重置到左侧-第二个显示器的手边!该错误如下图所示:
在这里,我在左侧有主显示器 1,在右侧有辅助显示器 2。显示了三个使用示例SetCursorPos
,其中光标从主显示器 1 移动到辅助显示器 2。
例如b
,SetCursorPos
按预期工作。但是,在示例a
和c
中,我们尝试将光标移动到显示 2 的错误区域,显示为红色阴影。然后光标位置重置到显示器 2 的左侧(显示为黄色阴影)!
这是重现该错误的最短程序:
#include <windows.h>
int main() {
POINT origPoint;
GetCursorPos(&origPoint);
SetCursorPos(origPoint.x + 200, origPoint.y + 200);
}
该程序将光标沿对角线向下和向右移动 200 个屏幕坐标。按照图中示例的方式使用它c
:将光标放在显示器 1 的右下角,然后运行程序。您会发现光标移到了显示 2 的左侧。
一些注意事项:
- 此错误的解决方法是调用
SetCursorPos
两次。第一次调用至少将光标移动到正确的显示。在第二次调用时,该错误不会发生,因为它没有在显示器上移动。但是,就我而言,我无法轻松更改调用它的站点。 - 我知道
ClipCursor
,但这不是行为的原因。GetClipCursor
报告一个包含整个虚拟屏幕的矩形(由GetSystemMetrics(SM_XVIRTUALSCREEN)
etc 报告)。即使使用ClipCursor(NULL)
,该错误仍然会发生。此外,上面的双重调用解决方法反驳了这个假设。 SetCursorPos
声称成功(返回1
),无论它是否显示此错误。(为简洁起见,省略了上面的错误检查。)- 一种替代方法
SetCursorPos
是SendInput
传递一个MOUSEINPUT
包含“标准化绝对坐标”的值。但是这种方法也受到完全相同的错误的影响! - 另一种替代方法
SetCursorPos
是mouse_event
传递归一化的绝对坐标。此方法也受到完全相同的错误的影响! - 我正在运行 Windows 10,版本 20H2,内部版本 19042.085。
我的心智模型有缺陷吗?是否有其他我不知道的光标移动限制或特殊情况?还是我应该将此报告为 Windows 错误?
解决方案
推荐阅读
- swift - 如何将 Nil 添加到 UIAlertAction
- javascript - 如何在位置固定的div下放置元素?
- python - Pandas:使用多个条件设置 var
- python - 多态性和 with 语句
- flowchart - 如何对齐美人鱼流程图节点中的文本?
- c# - ASP.Net Web API 和 CosmosDB。无法弄清楚如何在另一个服务类中使用一个服务类
- python - 当我导入我的个人库时,pd.DataFrame 上的简单求和函数需要永远
- python-3.x - 有没有办法拥有动态类?一个构造函数,给定数据状态,自动水合不同的类?
- android - 安卓 。使用默认风味/构建类型源文件夹
- android - 后台进程和正常运行时如何使用相同的实例对象