Entwickler-Ecke
Windows API - (Schon wieder) LowLevelKeyboardProc: Wie keyCode ändern?
hydemarie - Do 07.11.19 02:00
Titel: (Schon wieder) LowLevelKeyboardProc: Wie keyCode ändern?
Immer noch dasselbe kleine Programm ... ;)
Folgende Herausforderung: Ich würde gern, sehr abstrakt, per Hook bei bestimmten Eingaben einen anderen Text ausgeben, also wenn der Benutzer zum Beispiel irgendeinen Buchstaben eingibt, soll bei aktivem Hook stattdessen immer "B" auf dem Bildschirm erscheinen. Das funktioniert nur halb gut. Das hier habe ich versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| function LowLevelKeyboardProc(code: integer; WParam: WParam; LParam: LParam): LRESULT stdcall; const LLKHF_UP = $0080; var Hook: pKBHOOKSTRUCT; fEatKeystroke: boolean; begin fEatKeystroke := False;
try Hook := pKBHOOKSTRUCT(LParam); case code of HC_ACTION: begin if (Hook^.flags and LLKHF_UP) <> 0 then begin case Hook.vkCode of VK_A .. VK_Z: begin fEatKeystroke := True; keybd_event(VK_B, 0, 0, 0); end; end; end; end; end; finally if fEatKeystroke then Result := 1 else Result := CallNextHookEx(hkHook, code, WParam, LParam); end; end; |
Einen Teil des Codes habe ich im Internet gefunden, aber er kompiliert trotzdem. ;)
Ich bildete mir ein, dass die Kombination aus "schick ein B und fang den Rest ab" so funktioniert, aber tut's nicht: Wenn ich "a" eingebe, steht danach "ab" auf dem Bildschirm. Wie kann ich das "a" wegmachen?
Ralf Jansen - Do 07.11.19 14:17
Gefühlt ist der Test auf LLKHF_UP falsch. Ein Zeichen wird nicht beim loslassen des Knopfes gesendet sondern beim drücken. Man möchte den Knopf ja möglicherweise länger halten um mehrere Zeichen zu senden und nicht nur einen beim loslassen des Knopfs. "a" wurde also beim drücken des Knopfes gesendet und du hast zusätzlich beim loslassen "b" hinzugefügt.
hydemarie - Fr 08.11.19 02:05
Welchen Code muss ich denn stattdessen senden? Ich bin da ein bisschen überfordert. LLKHF_DOWN ($0081) funktioniert auf dieselbe Weise nicht.
hydemarie - Fr 08.11.19 13:32
Das Abfragen ist ja weniger das Problem - das Ändern krieg' ich aber noch nicht hin ...
Ralf Jansen - Fr 08.11.19 13:35
WM_KEYDOWN abfangen klingt richtig bedenken muss man aber das man wenn man einen Knopf länger hält nicht unbedingt mehrere WM_KEYDOWN Messages bekommt. WPARAM enthält auch die Anzahl für die diese Messages steht.
Ist zumindest wichtig wenn aus "aaaaaa" (wenn man einfach dauerhaft die a-Taste hält) "bbbbbb" werden soll und nicht "b".
hydemarie - Sa 09.11.19 02:36
Ich bin ja genügsam, mir würde schon ein Tastendruck reichen. Der Rest dürfte eventbasiert sein.
hydemarie - Sa 16.11.19 00:43
Bin ein bisschen weiter gekommen: Selbst, wenn die Funktion nichts macht außer "1" zurückgeben, erscheint die ursprüngliche Taste. Abfragen tu' ich zurzeit:
:?
jaenicke - Sa 16.11.19 17:19
Du musst die Taste schlicht immer unterdrücken, nicht nur beim UP-Ereignis.
hydemarie - Sa 16.11.19 17:28
Die Prüfung auf LLKHF_DOWN ganz rauszunehmen führt zum selben Ergebnis.
Ralf Jansen - Mi 18.12.19 22:00
Die Marshalling Methoden solltest du ersatzlos streichen können. Die dienen dazu die Brücke zwischen verwalteten und nicht verwalteten Speicher zu überbrücken also ein Problem das du in einer nativen Sprache nicht hast. Über deinen Pointer auf den KBHOOKSTRUCT solltest du vkCode einfach direkt ändern können.
hydemarie - Mi 18.12.19 22:06
Ja, aber der geänderte vkCode wird dann nicht an CallNextHookEx übergeben.
edit (spät): Ach so! Senden nur bei _DOWN, prüfen immer. Funktioniert!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!