2010-04-29 3 views
6

Wie kann ich programmgesteuert ein Linksklick-Ereignis an der Maus auslösen?Wie programmiere ich einen Mausklick in C#?

Danke.

edit: Das Ereignis wird nicht direkt auf einer Schaltfläche ausgelöst. Ich ziele auf die Windows-Plattform.

+2

In welcher Plattform? Winforms? WPF? Silverlight? Webformulare (= html/javascript)? Oder einfach "Windows" (Low-Level) –

+0

Mögliche Duplikate von [Wie simuliert man Mausklick in C#?] (Http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c) – AlexanderMP

Antwort

1

https://web.archive.org/web/20140214230712/http://www.pinvoke.net/default.aspx/user32.sendinput

Verwenden der Win32 API Eingang zu senden.

Update:

Da ich nicht mehr mit Win32-API arbeiten, ich werde diese Antwort richtig zu sein, nicht aktualisieren, wenn sich die Plattform Änderungen oder Webseiten nicht mehr verfügbar. Da diese Antwort nicht einmal den Stackoverflow-Standards entspricht (enthält nicht die Antwort selbst, sondern vielmehr einen Link zu einer externen, jetzt nicht mehr existierenden Ressource), hat es keinen Sinn, ihr Punkte zu geben oder mehr Zeit dafür aufzuwenden.

Stattdessen diese Frage auf Stackoverflow einen Blick darauf werfen, was ich denke, ist ein Duplikat:

How to simulate Mouse Click in C#?

+0

Ich finde, dass das nicht funktioniert z. Der Visual Studio Debugger setzt eine Zeile unter 'UINT' und unter 'INPUT [] 'Ich sehe, dass es keine Klasse wie UINT gibt, aber ich kann das zu UInt32 ändern. Aber ich würde nicht die äquivalente Änderung zu INPUT [] machen Lass es funktionieren – barlop

+0

@barlop Danke, dass du dieses Relikt ausgegraben hast :) und es tut mir leid, dass ich dir nicht helfen kann. Ich habe es als veraltet markiert. Suchen Sie nach besseren Antworten, z. http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c – AlexanderMP

+0

Sie unterbewerten die Gültigkeit Ihrer Antwort Andrei hat gesagt, dass die mouse_event Lösung veraltet ist und Ihre SendInput-Lösung ist mehr aktuell. Und in der Frage, zu der Sie verlinkt haben, hat die am besten bewertete Antwort die mouse_event-Lösung. Ihre Antwort mag also aktueller sein als die, die Sie dort finden. Und nur weil eine gute Website, pinvoke gekapert wurde oder auf redgate software umgeleitet wird, bedeutet das nicht, dass die Informationen auf der Webseite veraltet sind. In der Tat sagt die Hauptseite der pinvoke-Website im Moment für Wartungsarbeiten aus. – barlop

8

Wenn es nach rechts auf eine Schaltfläche ist, können Sie

button1.PerformClick(); 

Ansonsten verwenden, können Sie this MSDN article überprüfen, die Maus (und Tastatur) Eingabe bespricht simuliert.

Darüber hinaus kann this project Ihnen auch helfen können. Unter den Deckeln verwendet SendInput.

+0

Es ist merkwürdig für mich, dass Java eine bessere integrierte Unterstützung als C# zu haben scheint, weil man einfach an einem beliebigen Ort mit der Maus in Windows klicken kann, aber die InputSimulator-Bibliothek ist genau das, wonach ich gesucht habe. Sie sollten das in Ihrer Antwort deutlicher machen. – rob

8

per Mausklick ausführen:

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 

     private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
     private const int MOUSEEVENTF_LEFTUP = 0x04; 
     private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
     private const int MOUSEEVENTF_RIGHTUP = 0x10; 

     public static void DoMouseClick() 
     { 
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 
     } 

Um den Cursor zu bewegen, wo Sie wollen:

[DllImport("user32.dll")] 
     static extern bool SetCursorPos(int X, int Y); 

     public static void MoveCursorToPoint(int x, int y) 
     { 
      SetCursorPos(x, y); 
     } 
+2

Ich habe dieses gesehen, habe es versucht, aber die Funktion mouse_event ist veraltet. Ich versuche jetzt dasselbe mit SendInput zu machen. – Andrei

+0

Zusätzlich zu mouse_event, das durch SendInput abgelöst wird, wie Andrei darauf hingewiesen hat, können Sie die Mausposition übergeben, indem Sie die MOUSEEVENTF_ABSOLUTE-Maske im ersten Argument festlegen und die x- und y-Koordinaten im zweiten und dritten Argument übergeben, anstatt zuerst SetCursorPos aufzurufen. – rob

+0

Ich werde versuchen mit dieser Methode seit (wie auf der sendinput Antwort kommentiert), SendInput funktioniert noch nicht für mich. Mit dieser Methode habe ich einen Fehler bekommen. 'Managed Debugging Assistant' PInvokeStackImbalance 'hat ein Problem in' C: \ Use ..... \ Debug \ hprog.vshost.exe 'entdeckt. Zusätzliche Information: Ein Aufruf der PInvoke-Funktion 'prog1! Prog1.FrmBlah :: mouse_event' hat den Stack unausgeglichen. Dies liegt wahrscheinlich daran, dass die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur übereinstimmt. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Ziel-Signatur übereinstimmen.' – barlop

-1
button1_click(null, new EventArgs());