2011-01-07 5 views
2

Ich benutze SendInput, um Mauseingabe zu simulieren und bis jetzt kann ich links, rechts und mittlere Klicks erfolgreich simulieren. Allerdings kann ich die xButtons nicht korrekt simulieren. Ich Definition einer Eingangsstruktur wie folgt:Simulieren XButton-Eingabe mit SendInput

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 wie folgt definiert ist, und ich glaube, das ist, wo das Problem ist.

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

Haben Sie mit diesem Link Ihre Win32-Klasse zu bauen? http://www.pinvoke.net/default.aspx/user32/SendInput.html – digEmAll

+0

Ich habe die Win32-Klasse, die ich verwende, nicht erstellt, aber die, die ich verwende, ist nicht identisch mit der, die bei pinvoke.net/default gefunden wird .aspx/user32/SendInput.html, obwohl es das gleiche Verhalten hat. – Alex

Antwort

4

Es stellt sich heraus, dass ich versuchte anzugeben, welche Taste an der falschen Stelle gedrückt wurde. i.mi.dwFlags sollte nur Win32.MOUSEEVENTF.XDOWN oder Win32.MOUSEEVENTF.XUP angeben. Die gedrückte Taste sollte mit i.mi.mouseData eingestellt werden.

So x-Taste Eingang simulieren ich folgendes tun würde:

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())); 
+1

Alex, danke für deine Frage/Antwort! Das hilft mir jetzt wirklich. Wünschte, mehr Menschen würden ihre eigenen Fragen beantworten, wenn sie eine Lösung gefunden hätten! – Lunivore