SendInput - (鼠标移动模拟)

问题描述 投票:2回答:2

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

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()工作。我似乎无法弄清楚定位。

c++ mouseevent mouse sendinput
2个回答
2
投票

如果要将光标放在绝对坐标中,则必须添加更多标记:

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

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


0
投票

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

正确的等式是Y = mX + b,你有Y = mX。

仅当您的主显示器位于所有显示器的最左侧和最高位置时,此功能才有效。否则,虚拟桌面以负#开始,而不是0.但是你为b传递0。

归一化输入为0 - 0xffff,但非标准化的坐标通常来自(<= 0 - > = PrimarymonitorWidth。因此,您很可能是向右或向下的一个或多个监视器。

当您添加b或Y-Intercept时,您应该获得正确的位置。

© www.soinside.com 2019 - 2024. All rights reserved.