Laden...

[gelöst] Globales Abfangen vom 2 maligen Drücken der Strg-Taste

Erstellt von CSchle vor 3 Jahren Letzter Beitrag vor 3 Jahren 854 Views
C
CSchle Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren
[gelöst] Globales Abfangen vom 2 maligen Drücken der Strg-Taste

Hallo,

mittels RegisterHotkey kann man ja wunderbar Tastenkombinationen Systemweit abfangen und bekommt deren Betätigung gemeldet.

(hier gibt es aber das Problem, das die Betätigung dann dem Fenster mit Fokus nicht gemeldet wird; legt man z.B. die Space-Taste ein Hotkey, funktioniert im z.B. Editor keine Eingabe eines Leerzeichens mehr; wer hier eine Lösung hat, gerne willkommen).

Mein Problem ist, das ich so eine Art Hotkey erstellen will, aber auf die rechte Strg-Taste (ohne weitere Tasten). Und die Taste muss natürlich im Fenster mit Fokus weiterhin funktionieren. Hinzu kommt, das mein Programm erst nach 2 maligem drücken der Strg-Taste (so eine Art Doppelklick) reagieren soll. Wird die Taste nur einmal gedrückt (z.B. Strg+P) soll nichts passieren (außer natürlich im Fenster mit Fokus).

Den Key-State in einem Thread und einer (endlos) Schleife frisst zu viel Performance. Zumindest die erste Betätigung sollte per Event kommen, die zweite kann ich ja in einer Schleife, die 0,3 Sekunden geht, abfragen.

Für Ideen und Lösungen (am liebsten per Win32 API) bin ich dankbar.

Gruß,

Carsten

2.078 Beiträge seit 2012
vor 3 Jahren

Du kannst über die WinAPI Messages abfangen und ggf. reagieren:

Wenn ich mich richtig erinnere, müsste das "SetWindowsHookEx" sein.

F
10.010 Beiträge seit 2004
vor 3 Jahren

Geht doch viel einfacher.
Merk dir einfach beim drücken die aktuelle Zeit.
bei jedem eintritt schaust du erst ob seit dem letzten mal die eingestellte zeit abgelaufen war.

Kein threading nötig.

und es hindert dich niemand daran anschließend die Taste per SendKey wieder zu "posten"

C
CSchle Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Habe etwas herum experimentiert.

Das mit dem SetWindowsHookEx funktioniert.

Die Erfassung der Zeit (1. und 2. betätigen) war mir klar.

Wichtig war nur, das ich auf WM_KEYUP prüfe. Denn WM_KEYDOWN wird beim gedrückt halten ständig ausgelöst (also 1/2 Sekunde gedrückt halten sind >2 Betätigungen, was ja nicht stimmt). Beim WM_KEYUP funktioniert es super.

Damit ist ein großes Problem gelöst. Vielen Dank dafür.

Carsten

2.078 Beiträge seit 2012
vor 3 Jahren

Denk daran, den Hook auch wieder zu entfernen, für sowas ist das Disposable-Pattern gedacht.
Die Funktion ist von WinAPI, da hat die .NET-Runtime keinen Einfluss, also kann der GC auch nicht aufräumen.