Autor Beitrag
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: 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:

ausblenden volle Höhe 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
                  // Irgendeinen Buchstaben gedrückt. Mach immer B draus.
                  fEatKeystroke := True;
                  keybd_event(VK_B, 000);
                end;
                // Noch mehr Cases hier - ich kürze das mal ab.
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Fr 08.11.19 13:32 
Das Abfragen ist ja weniger das Problem - das Ändern krieg' ich aber noch nicht hin ...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: 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:

ausblenden Quelltext
1:
LLKHF_DOWN = $0081;					


:?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 16.11.19 17:19 
Du musst die Taste schlicht immer unterdrücken, nicht nur beim UP-Ereignis.
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: Sa 16.11.19 17:28 
Die Prüfung auf LLKHF_DOWN ganz rauszunehmen führt zum selben Ergebnis.
hydemarie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 475
Erhaltene Danke: 51



BeitragVerfasst: 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!