SendInput - (模拟鼠标移动)

4

我一直在尝试模拟一系列输入到一个进程中。 唯一我无法实现的是鼠标移动。 我在网上找到了最接近的解决方案:

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()已经起作用了。只是我似乎无法弄清位置。


应该会有帮助并可能回答:https://dev59.com/9Gs05IYBdhLWcg3wB9ef - user4581301
嗯,首先摆脱GetSystemMetrics()调用,直接使用x和y。并考虑您真正想使用MOUSEEVENTF_ABSOLUTE而不是增量移动。如果您从未为x和y传递负值,则后者将非常快速地将其发送到右下角。 - Hans Passant
4个回答

3

2

只是一个提示:处理这种公式的最佳方法:

x*(65536/GetSystemMetrics(SM_CXSCREEN))

使用MulDiv函数:

MulDiv(x, 65536, GetSystemMetrics(SM_CXSCREEN))

代码变得更清晰,更易于维护。


这并不是对问题的答案。一旦您获得足够的声望,您就可以评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - user16217248

0
如何处理具有偏移虚拟屏幕原点的多个显示器
虚拟屏幕的左上角不一定是(0,0)。如果您的主显示器不是最左边的显示器,那么原点可能位于虚拟屏幕的中间。为了处理这种情况,您的鼠标坐标转换范围必须包括平移和缩放,以使其范围从(0,0)到(0xFFFF, 0xFFFF)。
// Calculate x and y relative to the top-left corner of the virtual screen
LONG x_tl = x - GetSystemMetrics(SM_XVIRTUALSCREEN);
LONG y_tl = y - GetSystemMetrics(SM_YVIRTUALSCREEN);

INPUT evtMouse{};
evtMouse.type = INPUT_MOUSE;
evtMouse.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_ABSOLUTE;
evtMouse.mi.dx = MulDiv(x_tl, 0xFFFF, GetSystemMetrics(SM_CXVIRTUALSCREEN) - 1);
evtMouse.mi.dy = MulDiv(y_tl, 0xFFFF, GetSystemMetrics(SM_CYVIRTUALSCREEN) - 1);
evtMouse.mi.time = 0;
evtMouse.mi.mouseData = 0;
evtMouse.mi.dwExtraInfo = 0;

0

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

正确的方程式是Y = mX + b,你只有Y = mX。

这仅适用于您的主监视器是所有监视器中最左边和最高垂直的情况。否则,虚拟桌面从负数开始,而不是0。但是,您正在传递0作为b。

标准化输入范围为0-0xffff,但非标准化坐标通常从(<= 0- >= PrimarymonitorWidth)。因此,您很可能在右侧或下方1个或多个监视器。

当您添加b或Y-截距时,应该得到正确的位置。


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