SendInput -(鼠标移动模拟)
SendInput - (mouse movement simulation)
我一直在尝试模拟一个过程中的一系列输入。我唯一没能做到的是鼠标移动。我在网上找到了最接近的赌注:
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截距,你应该得到正确的位置
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- G锁定铸造到基础上会释放模拟行为
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 自定义先决条件对移动分配运算符有效吗
- 如何在C++中模拟鼠标光标的移动
- 将流的缓冲区与NULLPTR交换以模拟移动
- 为什么VS模拟rax,rax,0而不是简单的移动
- 我可以用什么UI库或其他东西来模拟用C++移动东西的交通状况
- 重载 + 运算符以模拟移动到下一个节点
- 模拟鼠标单击而不移动光标
- 是否有可能模拟鼠标移动和鼠标点击隐藏窗口
- 如何模拟鼠标移动
- SendInput -(鼠标移动模拟)
- 如何模拟鼠标同时在多个窗口中移动