Laden...
C
CSchle
myCSharp.de - Member
2
Themen
3
Beiträge
Letzte Aktivität
vor 4 Jahren
Dabei seit
28.05.2020
Alter
51
Erstellt vor 4 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

Erstellt vor 4 Jahren

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

Erstellt vor 4 Jahren

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