“mouse_event”函数 - 鼠标指针发送到(稍微)错误的坐标

6

mouse_event函数会将光标发送到略微偏离的坐标(偏移1-20像素)。它偏移的程度基于一个我无法完全理解的模式。

以下是我的代码:

int x, y;
int repeats = 1000;
int start = 0;
POINT pt;

for(int i=0; i<repeats; i+=10) //first loop, down right
{
    x = (65536 / 1920) * i - 1; //convert to absolute coordinates
    y = (65536 / 1080) * i - 1;
    mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0); //move
    GetCursorPos(&pt); //get cursor position
    if(pt.x != i){mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);} //check if the position is wrong, and if so fix it.
    if(pt.y != i){mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);}
    cout << "Try: " << i << ", " << i << "\tReal: " << pt.x << ", " << pt.y << "\tDiff: " << pt.x - i << ", " << pt.y - i << '\n';
}

    for(int i=repeats; i>0; i-=10) //second loop, up left
{
    x = (65536 / 1920) * i - 1;
    y = (65536 / 1080) * i - 1;
    mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
    GetCursorPos(&pt);
    if(pt.x != i){mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);}
    if(pt.y != i){mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);}
    cout << "Try: " << i << ", " << i << "\tReal: " << pt.x << ", " << pt.y << "\tDiff: " << pt.x - i << ", " << pt.y - i << '\n';
}

如果运行此程序,鼠标会从屏幕左上角向下和向右移动,然后再返回。但是,它向下移动得越远,“mouse_event”创建的鼠标移动就越不正确。

我先将其移动,然后记录当前坐标,然后计算差异。随着我向下滚动屏幕,差异(运动中的误差)会增加。我甚至尝试添加一个额外的检查,测试坐标是否偏离,然后尝试将鼠标移动到正确的位置,但它并没有起作用。

您有任何想法为什么会这样吗?以下是此程序输出的日志以供参考。

Output_Log.txt

很明显,在第一个循环中(移动鼠标向下和向右),误差增加,然后在第二个循环中(将其向上和向左移动)以相同的方式减少误差。

您有任何想法为什么会发生这种情况吗? 它也会在更复杂的实现中以我无法量化且不同于此的方式发生,因此我认为它必须是在mouse_event函数本身或一些我不理解的功能中。

提前感谢任何帮助。


为什么你要用65536/1920来计算x和y呢?难道你不应该将x和y设置为i的值吗? - joshuahealy
不行,因为我正在使用MOUSEEVENTF_ABSOLUTE标签,它需要0-65535的绝对坐标范围内的x和y。这是消除操作系统在移动中添加加速度的唯一方法,因为这会导致更多错误。 - Abraluna
在这种情况下,你应该使用浮点数算术并转换为整数。 - joshuahealy
正确的方法在 [SO]: python win32api MOUSEEVENTF_MOVE not working as expected (@CristiFati's answer) 中提供 (使用值: 65535 和 1919、1079,否则位置可能会偏离所需的一个像素)。 - CristiFati
1个回答

3
我认为这是由于使用整数运算来计算像素所致,请尝试以下操作:
x = (int)(65536.0 / 1920 * i - 1); //convert to absolute coordinates
y = (int)(65536.0 / 1080 * i - 1);

哇,这个方法可行,我非常感激你。非常感谢,显然这是某种舍入误差,现在我需要稍微调整一下这个排列。目前每次尝试都会给我一个(-1,-1)的错误,所以我相信这将很容易解决。http://puu.sh/34Xhm.txt - Abraluna
这不是一个舍入误差,而是整数算术运算的工作原理。例如,使用“int”,3/2=1,而如果使用“float”,3/2=1.5。在其中一个数字后添加“.0”会使编译器使用浮点算术。 - joshuahealy

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