为什么 SetCursorPos 将光标位置重置到显示屏的左侧?

2024-05-09

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(使用前将#替换为@)

为什么 SetCursorPos 将光标位置重置到显示屏的左侧? 的相关文章

  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

    更大的问题是一般如何使用实时 ETW 网络堆栈事件 但我特别感兴趣Microsoft Windows NDIS PacketCapture 提供程序 所有其他网络堆栈提供程序都部分工作 但 NDIS PacketCapture NDIS P
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 如何从Windows阻止社交媒体[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想根据时间阻止我的电脑上的社交媒体 晚上 9 点后屏蔽 上午 11 点后解锁 如家长控制 我尝试过关注但失败了 创建了
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐