Laden...

Systemweit Taste abfangen und ggfs. an System zurück übergeben

Erstellt von CSchle vor 3 Jahren Letzter Beitrag vor 3 Jahren 753 Views
C
CSchle Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren
Systemweit Taste abfangen und ggfs. an System zurück übergeben

Hi,

ich möchte Systemweit über das drücken einer Taste (Num -) informiert werden.

Bleibt die Taste eine Zeit lang gedrückt (100 ms ... 1000 ms) soll das System diese Taste nicht verarbeiten. D.h. in z.B. Notepad wird das - Zeichen nicht (weder einmal und durch die Wiederholungen auch nicht x mal) eingegeben.

Wurde die Taste nur kurz betötigt (< 100 ms ... < 1000 ms) dann soll das System sie normal verarbeiten (in diesem Fall wird im Notepad das - Zeichen eingegeben).

Fallbeispiel:

  1. Ich starte mein Programm, ich gehe in Notepad (oder ein anderes Programm in dem man Text eingeben kann; z.B. Chrome Adresszeile).

  2. Im Notepad gebe ich Text ein...

  3. Ich drücke Num - (kurz, so als wenn ich es eingeben will) und in Notepad wird das - Zeichen eingegeben.

  4. Ich drücke Num - (länger, sagen wir 1/2 Sekunde). Mein Programm öffnet ein Fenster, Notepad bekommt von dem - Zeichen (Num -) nichts mit.

Punkte 2 bis 4 beliebig wiederholbar und beliebige Reihenfolge.

Beispielprogramm ControlPad:
https://portableapps.com/apps/utilities/controlpad-portable
Sehr zu empfehlen aber wird nicht weiterentwickelt. Ich will eine eigene Version schreiben.

Lösungsversuche meinerseits:

  1. Per RegisterHotKey() (keine Control-Keys, nur VK_SUBTRACT)
    --> Hotkey per WndProc wunderbar abgefangen. Per Thread.Sleep() 150ms gewartet, GetAsyncKeyState() noch gedrückt oder nicht -> falls ja Fenster öffnen.
    Alles genau so, wie ich es will... AAAAABER : Man kann mit Num - überhaupt nichts mehr in Notepad eingeben, die Taste ist Tot und endet immer nur in meinem Programm.

  2. Per CallNextHookEx()
    --> Das WM_KEYDOWN wunderbar, mit return new IntPtr(1) verhindern, das die Taste zum Notepad kommt (auch gut). Aber die Zeichenwiederholung sendet scheinbar ständig KeyUp's und KeyDown's und GetKeyState() gibt teils eine 0 zurück (nicht gedrückt) obwohl ich die Taste nie losgelassen habe.

  3. DEINE LÖSUNG, hoffe ich 😉

Vielen Dank für jede Idee, probiert mal ControlPad (ohne Installation; nur starten... Num * gedrückt halten und 900 eingeben (Befehlsliste)). Das Programm ist alt aber super.

Gruß,

Carsten

5.658 Beiträge seit 2006
vor 3 Jahren

Daß bisher noch keine Antwort eingegangen ist, liegt wohl an deiner Frage. Niemand wird dir aus dem Kopf den Unterschied zwischen den beiden genannten Funktionen nennen können. Und eine fertige Lösung für dein spezielles Problem, nach der du ausdrücklich fragst, wird auch kaum jemand hier posten können.

Siehe dazu auch [Hinweis] Wie poste ich richtig?:
4. Verlangt keine fertigen Lösungen
4.2. Wälzt nicht eure Aufgaben auf uns ab

Aber es scheint klar zu sein, daß dein Konzept so nicht funktionieren kann. Wenn du einen Tastendruck global abfängst und behandelst, kannst du nicht davon ausgehen, daß es nach einer von dir festgelegten Zeit magischerweise nocheinmal gesendet wird. Das mußt du natürlich selbst an der richtigen Stelle nochmal senden.

Weeks of programming can save you hours of planning