SendInput -(鼠标移动模拟)

SendInput - (mouse movement simulation)

本文关键字:模拟 移动 鼠标 SendInput      更新时间:2023-10-16

我一直在尝试模拟一个过程中的一系列输入。我唯一没能做到的是鼠标移动。我在网上找到了最接近的赌注:

bool mouse_move(int x, int y)
{
    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.mouseData = 0;
    input.mi.time = 0;
    input.mi.dx = x*(65536/GetSystemMetrics(SM_CXSCREEN));//x being coord in pixels
    input.mi.dy = y*(65536/GetSystemMetrics(SM_CYSCREEN));//y being coord in pixels
    input.mi.dwFlags = MOUSEEVENTF_MOVE;//MOUSEEVENTF_ABSOLUTE
    SendInput(1, &input, sizeof(input));
    return true;
}

我不理解这个结构,因为它在网上解释。无论我输入什么值(显然0除外),鼠标都会一直移动到屏幕右下角。

通过SetCursorPos()是可能的,是的,但是一旦我进入这个过程,这个函数就不再工作了。我需要模拟它,如果用户正在输入鼠标移动,到目前为止,SendInput()工作。

如果您想将光标放置在绝对坐标中,则必须添加更多标志:

input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_ABSOLUTE;

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273 (v = vs.85) . aspx

提示:处理这类公式的最佳方法是:

x*(65536/GetSystemMetrics(SM_CXSCREEN))

是使用MulDiv:

MulDiv(x, 65536, GetSystemMetrics(SM_CXSCREEN))
代码变得更清晰,更容易维护。

这不是正确的等式:dx = x*(65536/GetSystemMetrics(SM_CXSCREEN))

适当的方程是Y = mX + b,你有Y = mX

这只适用于如果你的主显示器是最左边的,垂直最高的所有显示器。否则,虚拟桌面从负#开始,而不是0。但是你将0传递给b。

归一化输入从0 - 0xffff,但非归一化的坐标通常从(<= 0 ->= PrimarymonitorWidth)。所以你很可能有1个或多个显示器在右边或下面。

当你加入b,或y截距,你应该得到正确的位置