Einzelnen Beitrag anzeigen

schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#8

Re: Simulierten Hotkey per WMHotKey abfangen?

  Alt 21. Apr 2008, 17:34
Hab jetzt alles dynamisch gelöst:

Code:
    //ein Tasten Shorcut
     if (TPMsg(lParam)^.wParam = HandleHook[i].car3) and (HandleHook[i].car4 = 0) and (HandleHook[i].car5 = 0) then // 1. Cardinal
        begin
            if TPMsg(lParam)^.message = WM_KEYDOWN then// Taste unten
            begin
              SetForeGroundWIndow(WindowHandle);

              keybd_event(HandleHook[i].car1, 0, 0, 0);

                if not (HandleHook[i].car2 = 0) then begin
                  keybd_event(HandleHook[i].car2, 0, 0, 0);
                  keybd_event(HandleHook[i].car1, 0, KEYEVENTF_KEYUP,0);
                  keybd_event(HandleHook[i].car2, 0, KEYEVENTF_KEYUP,0);
                end
                else keybd_event(HandleHook[i].car1, 0, KEYEVENTF_KEYUP,0);

              Messagebox(0, PChar(HandleHook[i].str1), 'H O O K', 0);
              Kill := True;
            end;

     end

     //zwei Tasten Shorcut
     else if (GetKeyState(HandleHook[i].car3)< 0) and (HandleHook[i].car4 <> 0) and (HandleHook[i].car5 = 0) then // 1. Cardinal
      begin
        if TPMsg(lParam)^.wParam = HandleHook[i].car4 then // 2. Cardinal
        begin
            if TPMsg(lParam)^.message = WM_KEYDOWN then// Taste unten
            begin
              SetForeGroundWIndow(WindowHandle);

              keybd_event(HandleHook[i].car1, 0, 0, 0);

                if not (HandleHook[i].car2 = 0) then begin
                  keybd_event(HandleHook[i].car2, 0, 0, 0);
                  keybd_event(HandleHook[i].car1, 0, KEYEVENTF_KEYUP,0);
                  keybd_event(HandleHook[i].car2, 0, KEYEVENTF_KEYUP,0);
                end
                else keybd_event(HandleHook[i].car1, 0, KEYEVENTF_KEYUP,0);
              Messagebox(0, PChar(HandleHook[i].str1), 'H O O K', 0);
              Kill := True;
            end;
        end;
    end
     //drei Tasten Shorcut
    else if (GetKeyState(HandleHook[i].car3)< 0) and (GetKeyState(HandleHook[i].car4)< 0) then // 1. + 2. Cardinal
      begin
        if TPMsg(lParam)^.wParam = HandleHook[i].car5 then // 3. Cardinal
        begin
            if TPMsg(lParam)^.message = WM_KEYDOWN then// Taste unten
            begin
              SetForeGroundWIndow(WindowHandle);

              keybd_event(HandleHook[i].car1, 0, 0, 0);

                if not (HandleHook[i].car2 = 0) then begin
                  keybd_event(HandleHook[i].car2, 0, 0, 0);
                  keybd_event(HandleHook[i].car1, 0, KEYEVENTF_KEYUP,0);
                  keybd_event(HandleHook[i].car2, 0, KEYEVENTF_KEYUP,0);
                end
                else keybd_event(HandleHook[i].car1, 0, KEYEVENTF_KEYUP,0);          
              Messagebox(0, PChar(HandleHook[i].str1), 'H O O K', 0);
              Kill := True;
            end;
        end;
     end;
Hirmit kann ich 1, 2 & 3 Tasten-Codes abfangen.

Nun Fange ich z.B. die Tast "ESC" ab. Geht auch super!

Mein Problem ist nun wenn ich aus:

Abfangen -> Weiterschicken
ESC -> Enter
Enter -> Enter

mache, verfängt sich die Schleife natürlich in eine Endlosschleife wenn ich nun "Esc" drücke!

Sinn der Sache ist:

Ich habe 3 Programme, Prog1 sendet an Prog2 einen Shortcut. Dieser soll jedoch abgefangen werden und an Prog3 geschickt werden.

Muss ich da jetzt jedesmal bevor ich ein keybd_event auslöse den Hook wieder auflösen damit es sich nicht endlos in der Schleife verfängt?

EDIT:

zusätzlich habe ich herausgefunden, dass die Variable "HandleHook[i]", die Global definiert ist meinen Hook auf nurmehr Lokal verändert!

Wie kann ich das noch übergehen, denn die Array HandleHook wird in einer anderen Funktion bei SetHook erst aufgefüllt.
  Mit Zitat antworten Zitat