| Autor | 
Beitrag | 
hydemarie 
        
 
Beiträge: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Do 07.11.19 01: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: 4708 
Erhaltene Danke: 991 
 
 
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro 
 | 
Verfasst: Do 07.11.19 13: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: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Fr 08.11.19 01: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: 4800 
Erhaltene Danke: 1059 
 
Win10 
C#, C++ (VS 2017/19/22) 
 | 
Verfasst: Fr 08.11.19 06: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: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Fr 08.11.19 12:32 
 
Das Abfragen ist ja weniger das Problem - das Ändern krieg' ich aber noch nicht hin ... 
 
 | 
 | 
Ralf Jansen 
        
 
Beiträge: 4708 
Erhaltene Danke: 991 
 
 
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro 
 | 
Verfasst: Fr 08.11.19 12: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: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Sa 09.11.19 01:36 
 
Ich bin ja genügsam, mir würde schon ein Tastendruck reichen. Der Rest dürfte eventbasiert sein. 
 
 | 
 | 
hydemarie   
        
 
Beiträge: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Fr 15.11.19 23:43 
 
 | 
 | 
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Sa 16.11.19 16:19 
 
Du musst die Taste schlicht immer unterdrücken, nicht nur beim UP-Ereignis. 
 
 | 
 | 
hydemarie   
        
 
Beiträge: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Sa 16.11.19 16:28 
 
Die Prüfung auf LLKHF_DOWN ganz rauszunehmen führt zum selben Ergebnis. 
 
 | 
 | 
hydemarie   
        
 
Beiträge: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Mi 18.12.19 18: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: 4708 
Erhaltene Danke: 991 
 
 
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro 
 | 
Verfasst: Mi 18.12.19 21: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: 482 
Erhaltene Danke: 51 
 
 
 
 | 
Verfasst: Mi 18.12.19 21: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! 
 
 | 
 |