Wie simuliere ich Maus und Tastatur mit C # oder C ++?

8

Ich möchte mit der Entwicklung für Kinect beginnen, aber das schwierigste Thema dafür - wie man Tastatur- und Mauseingaben an jede Anwendung sendet. In der vorherigen Frage habe ich einen Rat erhalten, meinen eigenen Treiber für diese Geräte zu entwickeln, aber dies wird eine Weile dauern.

Ich stelle mir eine Anwendung wie ein Gate vor, die SendMessages in systemweite Eingaben oder Treiberanwendungen mit API übersetzen kann, um diese Eingaben zu senden. Ich frage mich also, ob es Treiber oder Simulatoren gibt, die mit C # oder C ++ interagieren können.

Kleine Ausgabe: SendMessage, PostMessage, keybd_event funktioniert nur unter Windows-Anwendungen mit allgemeiner Nachrichtenschleife. Ich brauche also eine Treiberanwendung, die auf niedriger Kernel-Ebene funktioniert.

Dracontis
quelle
Klingt so, als ob Sie an Software wie Auto Hot Key interessiert wären, die Tastendrücke und ähnliches für eine andere Anwendung simuliert ... aber nicht ganz sicher ... also nur einen Kommentar.
James
2
Treiber mit API, der eine echte Tastatur simuliert.
Dracontis
Möglicherweise haben Sie mehr Glück mit StackOverflow. Diese Frage ist wahrscheinlich niedriger als die der meisten Benutzer hier. Ich kann mich irren.
Verlangsamte
Ich kann keine Fragen zu StackOverflow stellen.
Dracontis
Warum nicht? Stackoverflow ist definitiv ein großartiger Ort, um Fragen wie diese zu stellen.
Ultifinitus

Antworten:

2

Für eine C # -Anwendung:

Um die Maus zu bewegen, ist die Cursor-Klasse unser Freund, da Cursor.Position zum Bewegen der Maus verwendet werden kann.

Um Tastendrücke zu simulieren, ist die Klasse Sendkeys Ihr Freund. SendKeys.Send () wird zum Simulieren eines Tastendrucks verwendet

Zum Klicken mit der Maus kenne ich keine netten Wrapper, aber dieser Code sollte funktionieren:

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

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

public void MouseClick()
{
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}

(Ersetzen Sie einfach x und y durch die tatsächliche Mausposition, möglicherweise verwenden Sie die Cursor-Klasse erneut.)

Alternativ können Sie die globale Maus- und Tastaturbibliothek von CodeProject für eine einfache und übersichtliche Oberfläche des gesamten Prozesses verwenden

Jordaan Mylonas
quelle
1
Leider funktioniert dies nicht für DirectInput / XInput-Anwendungen.
Jonathan Dickinson
Ereignisse funktionieren nicht in jeder Anwendung. Vielleicht wird das Spiel manchmal mit einer gemeinsamen Nachrichtenschleife verbunden und diese Bibliothek oder Funktion funktioniert, aber nicht in jeder. Ich brauche eine treiberähnliche Anwendung.
Dracontis
2

Sie müssen lediglich einen Systemtreiber für ein Human Interface Device (HID) erstellen. Der vorherige Rat zum Erstellen eines Treibers ist richtig, da Sie, wie Sie bemerkt haben, Ereignisse nicht einfach in übergeordnete Systeme einfügen und eine universelle Abdeckung erhalten können.

Vielleicht möchten Sie hier beginnen: Geben Sie hier die Linkbeschreibung ein und suchen Sie in MSDN nach Treiberbeispielen, auf denen Ihre Arbeit basiert.

Patrick Hughes
quelle
1
Ich möchte auch hinzufügen, dass Sie bei Verwendung des SendMessage-Ansatzes UIAccess = true in Ihrem Manifest benötigen, um mit Anwendungen zu interagieren, die als Admin gestartet wurden. Dazu müssen Sie Ihren Code digital signiert haben (teuer). Das Schreiben eines Gerätetreibers ist eine bessere / korrektere Lösung, erfordert jedoch auch einen signierten Treiber auf x64.
NtscCobalt
1

Der beste Weg, dies zu tun, besteht darin, mit WDK einen eigenen Tastatur- / Maustreiber zu erstellen. Es ist eine genaue und gut aussehende Lösung, aber es wird viel Zeit in Anspruch nehmen, wenn Sie Anfänger in der Programmierung sind.

Eine andere Lösung ist die Verwendung von GlovePIE . Sie können Ihr eigenes Skript aufschreiben und dann verwenden. Dann müssen Sie eine Nachricht mit Ihrer Anwendung an GlovePIE senden. Dadurch werden Eingaben auf Kernel-Ebene generiert, sodass dies in DirectX-Spielen und Nachrichtenschleifenanwendungen funktioniert.

Nun, ich möchte wirklich so etwas, aber mit der Möglichkeit, als Hintergrundprozess (GlovePIE startet mit dem Fenstermodus und dann können Sie ihn drehen) oder vielleicht als Bibliothek ausgeführt werden. Wenn ich etwas anderes gefunden habe, aktualisiere ich die Antwort.

Dracontis
quelle