Autor |
Beitrag |
hydemarie
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: Do 07.11.19 02:00
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:
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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: hydemarie
|
|
hydemarie
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: 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.
|
|
Th69
Beiträge: 4788
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 08.11.19 07:04
Frage mal direkt den WParam ab, entsprechend LowLevelKeyboardProc (ob das einen Unterschied macht)?
Dies wird in dem (wenn auch C#-Code) How to disable specific key auch so gemacht.
Für diesen Beitrag haben gedankt: hydemarie
|
|
hydemarie
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: Fr 08.11.19 13:32
Das Abfragen ist ja weniger das Problem - das Ändern krieg' ich aber noch nicht hin ...
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: 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
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: Sa 16.11.19 00:43
|
|
jaenicke
Beiträge: 19286
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 16.11.19 17:19
Du musst die Taste schlicht immer unterdrücken, nicht nur beim UP-Ereignis.
|
|
hydemarie
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: Sa 16.11.19 17:28
Die Prüfung auf LLKHF_DOWN ganz rauszunehmen führt zum selben Ergebnis.
|
|
hydemarie
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: Mi 18.12.19 19:32
Ah - offensichtlich muss ich den Hook direkt in den LParam zurückschreiben:
stackoverflow.com/qu...ters/2062757#2062757
Was ist denn die FPC-Version von "Marshal.StructureToPtr"?
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: hydemarie
|
|
hydemarie
Beiträge: 481
Erhaltene Danke: 51
|
Verfasst: 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!
|
|