我一直在尝试模拟一个过程中的一系列输入。我唯一没能做到的是鼠标移动。我在网上找到了最接近的赌注:
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截距,你应该得到正确的位置