【问题标题】:Simulating XButton input using SendInput使用 SendInput 模拟 XButton 输入
【发布时间】:2011-06-05 04:43:36
【问题描述】:

我使用 SendInput 来模拟鼠标输入,到目前为止我可以成功地模拟左键、右键和中键。但是,我似乎无法正确模拟 xButton。我正在定义一个输入结构如下:

Win32.INPUT i = new Win32.INPUT();
            i.type = Win32.INPUTF.MOUSE;
            i.mi.dx = 0;
            i.mi.dy = 0;
            i.mi.mouseData = 0;
            i.mi.time = 0;
            i.mi.dwExtraInfo = UIntPtr.Zero;
            i.mi.dwFlags = MouseButton(e.Button, true);
            Win32.SendInput(1, ref i, System.Runtime.InteropServices.Marshal.SizeOf(new Win32.INPUT()));

MouseButton 定义如下,我相信这就是问题所在。

private Win32.MOUSEEVENTF MouseButton(MouseButtons mb, bool up)
    {
        switch (mb)
        {
            case MouseButtons.Left:
                return up ? Win32.MOUSEEVENTF.LEFTUP : Win32.MOUSEEVENTF.LEFTDOWN;
            case MouseButtons.Right:
                return up ? Win32.MOUSEEVENTF.RIGHTUP : Win32.MOUSEEVENTF.RIGHTDOWN;
            case MouseButtons.Middle:
                return up ? Win32.MOUSEEVENTF.MIDDLEUP : Win32.MOUSEEVENTF.MIDDLEDOWN;
            case MouseButtons.XButton1:
                return up ?  Win32.MOUSEEVENTF.XBUTTON1|Win32.MOUSEEVENTF.XUP  : Win32.MOUSEEVENTF.XBUTTON1 | Win32.MOUSEEVENTF.XDOWN;
            case MouseButtons.XButton2:
                return up ? Win32.MOUSEEVENTF.XBUTTON2 | Win32.MOUSEEVENTF.XUP : Win32.MOUSEEVENTF.XBUTTON2 | Win32.MOUSEEVENTF.XDOWN;
            default:
                return 0u;
        }
    }

【问题讨论】:

  • 您是否使用此链接来构建您的 Win32 类? pinvoke.net/default.aspx/user32/SendInput.html
  • 我没有构建我正在使用的 Win32 类,但我正在使用的类与 pinvoke.net/default.aspx/user32/SendInput.html 中的类不同,尽管它确实如此具有相同的行为。

标签: c# input mouse sendinput


【解决方案1】:

原来我试图指定在错误的位置按下了哪个按钮。 i.mi.dwFlags 只能指定 Win32.MOUSEEVENTF.XDOWNWin32.MOUSEEVENTF.XUP。按下的按钮应使用i.mi.mouseData 设置。

所以要模拟 x 按钮输入,我会执行以下操作:

Win32.INPUT i = new Win32.INPUT();
            i.type = Win32.INPUTF.MOUSE;
            i.mi.dx = 0;
            i.mi.dy = 0;
            switch (e.Button)
            {
                case System.Windows.Forms.MouseButtons.XButton1:
                    i.mi.mouseData = (uint)Win32.MOUSEEVENTF.XBUTTON1;
                    break;
                case System.Windows.Forms.MouseButtons.XButton2:
                    i.mi.mouseData = (uint)Win32.MOUSEEVENTF.XBUTTON2;
                    break;
                default:
                    i.mi.mouseData = 0;
                    break;
            }

            i.mi.time = 0;
            i.mi.dwExtraInfo = UIntPtr.Zero;
            i.mi.dwFlags = Win32.MOUSEEVENTF.XUP;
            Win32.SendInput(1, ref i, System.Runtime.InteropServices.Marshal.SizeOf(new Win32.INPUT()));

【讨论】:

  • Alex,感谢您发布您的问题/答案!这对我现在真的很有帮助。希望更多人在找到解决方案后回答自己的问题!
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多