Wie man einen Schlüssel drückt und ihn mit C # freigibt?

8

Ich schreibe ein C # -Programm, das Signale von einem externen Gerät erfasst und Tastenanschläge an eine andere Anwendung sendet. Ich benutze SendKeys und es funktioniert gut.

SendKeys "drückt" eine Taste durch gleichzeitiges Drücken und Loslassen. Ich möchte es Schlüssel drücken und es nach Belieben freigeben.

Meine Frage ist: "Gibt es eine Möglichkeit, ein" Push "-Signal an eine Taste zu senden, dann ein" Freigabe "-Signal nach einer gewissen Zeit?"

Ich bin nicht sicher, ob SendKeys das kann. Irgendwelche Hinweise?

    
Larry 05.10.2008, 17:52
quelle

4 Antworten

5

Ich glaube nicht, dass es direkt von .NET möglich ist Sie könnten versuchen, den systemeigenen Aufruf von keybd_event zu verwenden, indem Sie die Funktion wie hier beschrieben aufrufen: Ссылка

Der MSDN für keybd_event ist hier: Ссылка

Hoffe das hilft!

    
Adam Haile 05.10.2008, 18:11
quelle
4

Die akzeptierte Antwort verwendet keybd_event , was veraltet ist. Die offizielle API ist jetzt SendInput . Es gibt auch einen schönen Wrapper dafür in Ссылка .

Keines der oben genannten Punkte entspricht jedoch vollständig dem Szenario "Schlüsselhaltung". Dies liegt daran, dass das Halten eines Schlüssels mehrere WM_KEYDOWN -Nachrichten generiert, gefolgt von einer einzelnen WM_KEYUP -Nachricht bei der Veröffentlichung (Sie können dies mit Spy ++ überprüfen).

Die Häufigkeit der WM_KEYDOWN -Nachrichten hängt von der Hardware, BIOS-Einstellungen und einigen Windows-Einstellungen ab: KeyboardDelay und KeyboardSpeed . Letztere sind über Windows Forms zugänglich ( SystemInformation.KeyboardDelay , SystemInformation.KeyboardSpeed ).

Mit der oben erwähnten Input Simulator-Bibliothek habe ich eine Schlüsselhaltungsmethode implementiert, die das tatsächliche Verhalten nachahmt. Es ist await/async bereit und unterstützt die Löschung.

%Vor%     
Ohad Schneider 01.03.2012 02:01
quelle
3

Sie können SendInput oder keyb_event verwenden, beides sind native API-Funktionen. SendInput hat einige Vorteile gegenüber keybd_event, aber SendInput ist erst ab XP verfügbar.

Hier ist der msdn Link Ссылка

Hoffe, das hilft

    
Dan Cristoloveanu 05.10.2008 18:22
quelle
1

Ich habe einmal versucht, das Gleiche am Powerpoint zu tun, den Cursor zu verstecken und später die Diashow zu stoppen. Aber es ist schwierig und schwierig, da viele Power-Level-Fenster in Powerpoint erscheinen. Außerdem ist es schwer herauszufinden, welcher Teil der Emulation fehlgeschlagen ist, wenn er nicht funktioniert. Nachdem ich mit Hilfe von Spy ++ in die Nachrichtenwarteschlange geschaut habe, habe ich festgestellt, dass der Befehl accelerator nach dem Tastendruck gesendet wurde. Stattdessen habe ich den Befehl accelerator emuliert und funktioniert wie ein Charm. Also solltest du vielleicht auf diese Weise nach Alternativen suchen.

    
faulty 06.10.2008 02:36
quelle

Tags und Links