我试图制作一个为鼠标编程一些功能的程序,我试图模拟鼠标输入移动。目前我正在尝试使用SendInput:
INPUT mouseMoveInput = new INPUT();
mouseMoveInput.type = SendInputEventType.InputMouse;
mouseMoveInput.mkhi.mi.dx = ((x * 65536) / GetSystemMetrics(SystemMetric.SM_CXSCREEN) -1);
mouseMoveInput.mkhi.mi.dy = ((y * 65536) / GetSystemMetrics(SystemMetric.SM_CYSCREEN) -1);
mouseMoveInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE | MouseEventFlags.MOUSEEVENTF_VIRTUALDESK | MouseEventFlags.MOUSEEVENTF_ABSOLUTE;
SendInput(1, ref mouseMoveInput, Marshal.SizeOf(new INPUT()));
问题是,对我来说,这并不能模拟它只是移动鼠标的实际输入。因此,例如,在360度鼠标移动的程序中(例如在3D游戏中),鼠标仅移动到"光标"到达屏幕底部(1920 * 1080)。我试图弄清楚如何模拟和实际输入,例如鼠标软件在编程"宏"在他们。没有创建自己的驱动程序有没有可能做到这一点?感谢任何有帮助的人! :d
答案 0 :(得分:0)
我认为这行可能是您的问题:
mouseMoveInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE | MouseEventFlags.MOUSEEVENTF_VIRTUALDESK | MouseEventFlags.MOUSEEVENTF_ABSOLUTE;
通过删除VIRTUALDESK和ABSOLUTE标志来尝试使用鼠标的相对运动。
如果鼠标已移动,则由 MOUSEEVENTF_MOVE , dx 和 dy 指示,以指定有关该移动的信息。该信息被指定为绝对或相对整数值。
如果指定了 MOUSEEVENTF_ABSOLUTE 值,则 dx 和 dy 包含0到65,535之间的归一化绝对坐标。事件过程将这些坐标映射到显示表面上。坐标(0,0)映射到显示表面的左上角;坐标(65535,65535)映射到右下角。在多监视器系统中,坐标映射到主监视器。
如果指定了 MOUSEEVENTF_VIRTUALDESK ,则坐标将映射到整个虚拟桌面。
如果未指定 MOUSEEVENTF_ABSOLUTE 值,则 dx 和 dy 指定相对于上一个鼠标事件(最后报告的位置)的移动。正值表示鼠标向右(或向下)移动;负值表示鼠标向左(或向上)移动。
鼠标的相对运动受鼠标速度和两个鼠标阈值的影响。用户可以使用“控制面板”的鼠标“ 属性”表中的指针速度滑块设置这三个值。您可以使用SystemParametersInfo
函数来获取和设置这些值。
系统对指定的相对鼠标移动进行两次测试。如果沿x或y轴指定的距离大于第一个鼠标阈值,并且鼠标速度不为零,则系统会将距离加倍。如果沿x或y轴指定的距离大于第二个鼠标阈值,并且鼠标速度等于2,则系统会将应用第一个阈值测试产生的距离加倍。因此,系统可能会将指定的鼠标沿x或y轴的相对移动量乘以四倍。