“mouse_event”函数 - 将光标发送到(略微)错误的坐标

时间:2013-05-31 03:59:15

标签: c++ windows mouse coordinates pixel

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函数本身或某些我不理解的特性中

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:1)

我说它是因为使用整数运算算出像素,试试这个:

x = (int)(65536.0 / 1920 * i - 1); //convert to absolute coordinates
y = (int)(65536.0 / 1080 * i - 1);