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.