c#如何模拟鼠标INPUT?

时间:2018-06-19 10:57:11

标签: c# input mouse sendinput

我试图制作一个为鼠标编程一些功能的程序,我试图模拟鼠标输入移动。目前我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

我认为这行可能是您的问题:

mouseMoveInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE | MouseEventFlags.MOUSEEVENTF_VIRTUALDESK | MouseEventFlags.MOUSEEVENTF_ABSOLUTE;

通过删除VIRTUALDESK和ABSOLUTE标志来尝试使用鼠标的相对运动。

_

来自MSDN MOUSEINPUT structure

如果鼠标已移动,则由 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轴的相对移动量乘以四倍。