Einzelnen Beitrag anzeigen

hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#15

AW: Tastaturhook auf Bildschirmschoner

  Alt 25. Jan 2013, 10:47
Ich bin immer noch an diesem Problem, aber der Sache einiges näher gekommen! An sich funktioniert ein Hook auf dem Bildschirmschoner-Desktop! Das Problem ist aber das, dass man bei der CallBack-Routine über CallNextHookEx die empfangenen Tastenwerte weitergeben sollte. Und wenn man das macht, reagiert natürlich der Bildschirmschoner, indem er sich beendet. Und damit ist es aus den für weiteren Hook-Empfang in meinem Programm. Es kommt also nur gerade das erste KeyDown-Event der ersten Taste. Da ich aber eine Doppeltasten-Kombination benötige, müssten zuerst zwei KeyDown- und danach zwei KeyUp-Events der richtigen Tastenkombination kommen.
Nun habe ich folgende Routine geschrieben:
Code:
function CallBackDelHook(Code: Integer; wParam: WPARAM; lParam:LPARAM): LRESULT; stdcall;
var SendStr : string;
var Res    : boolean;
var HiC    : DWORD;
begin
 Res := True;
 if code = HC_ACTION then
    begin
    if Erster = 0 then               {noch nichts}
       begin
       if (wParam = WM_KEYDOWN) then {nur wenn Key Down}
          begin
          HiC := PKBDLLHookInfo(lParam).vkCode;
          if (HiC = TCode1) or (HiC = TCode2) then
             begin
             Erster := HiC;
             Res   := False;
             end;
          end;
       end
    else                            {bereits einer da}
       begin
       if (wParam = WM_KEYDOWN) then {nur wenn Key Down}
          begin
          HiC := PKBDLLHookInfo(lParam).vkCode;
          if (HiC = TCode1) or (HiC = TCode2) then
             begin
             Zweiter := HiC;
             if Erster <> Zweiter then
                begin
                SendStr := 'Hook ' + format('%3d', [Erster]) +  ' ¦ ' + format('%3d', [Zweiter]);
                AssignFile(filno, Pfad + 'AMTest.log');
                Append(filno);
                Writeln(filno, TimeToStr(Now) + ' ' + SendStr);
                CloseFile(filno);
                Res   := False;
                end;
             end;
          end
       else                       {Key up und ausgelöst}
          begin
          if (Zweiter <> 0) and (Erster <> Zweiter) then
             Res   := False;
          end;
       end;
    end;
{ if Res = True then
    Result := CallNextHookEx(0, Code, wParam, lParam)
 else
    Result := 0;    }
end;
Die Idee: Die Tasten nicht weiter geben, wenn sie zur gewünschten Kombination gehören. Das wird über das Flag 'Res' gesteuert. Aber funktionieren tut es nicht. Wenn ich die unten auskommentierten Zeilen aktiviere, habe ich wieder den Effekt, dass mir der Bildschirmschoner nach einem Hookevent aktiviert wird. Wenn ich es aber so laufen lasse wie oben, dann funktioniert das Ganze mit dem Schönheitsfehler, dass sich danach der Bildschirmschoner nur noch mit der Maus beenden lässt.

Irgendwo mach ich einen Überlegungsfehler, seh ihn aber nicht.
Heinz Schneider
  Mit Zitat antworten Zitat