2011-01-07 59 views
2

我使用SendInput來模擬鼠標輸入,到目前爲止,我可以成功地模擬左,右和中點擊。但是,我似乎無法正確模擬xButton。我正在定義一個輸入結構如下:使用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; 
     } 
    } 
+0

你使用這個鏈接來建立你的Win32類? http://www.pinvoke.net/default.aspx/user32/SendInput.html – digEmAll 2011-01-07 11:00:45

+0

我沒有構建我正在使用的Win32類,但是我使用的類與在pinvoke.net/default中找到的不一樣.aspx/user32/SendInput.html,儘管它具有相同的行爲。 – Alex 2011-01-18 04:22:48

回答

4

原來我試圖指定哪個按鈕被按在錯誤的地方。 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()));