我一直在尝试模拟流程中的一系列输入。 我唯一没有成功的是鼠标移动。 我在网上找到了最接近的赌注:
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()
工作。我似乎无法弄清楚定位。
答案 0 :(得分:2)
如果要将光标放在绝对坐标中,则必须添加更多标记:
input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_ABSOLUTE;
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
答案 1 :(得分:0)
这不是正确的等式:dx = x *(65536 / GetSystemMetrics(SM_CXSCREEN))
正确的等式是Y = mX + b,你有Y = mX。
仅当主显示器在所有显示器的最左侧和垂直最高时才起作用。否则,虚拟桌面将从负号(而不是0)开始。但是您要为b传递0。
归一化的输入范围是0-0xffff,但非归一化的坐标通常来自(<= 0-> = PrimarymonitorWidth。因此,您很可能在右边和/或下面有1个或更多显示器。
在添加b或Y轴截距时,您应该获得正确的位置。