Ich habe gerade echt ein nettes Problem und habe keine Ahnung, warum dieses Problem auftritt. Ich habe ewig gebraucht um den Fehler zu finden, da er verzögert auftritt -- ich glaube, dass es zu dem Zeitpunkt statt findet, zum der Hook auf die erste Nachricht reagieren soll. So registriere ich den Hook:
Delphi-Quellcode:
procedure TMyHook.InstallMessageHook();
var
Method: TMethod;
begin
if (FHookHandle <> 0)
then
raise Exception.Create('
Hook is already installed. Please uninstall hook first.');
Method.Code := @TMyHook.HookProc;
Method.Data := Self;
FHookMethodPointer := MakeProcInstance(Method);
FHookHandle := SetWindowsHookEx(WH_CALLWNDPROC, FHookMethodPointer, 0, GetCurrentThreadId());
if (FHookHandle = 0)
then
RaiseLastOSError();
end;
function TMyHook.HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult;
stdcall;
var
P: PCWPStruct;
begin
case nCode < HC_ACTION
of
True:
Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
else
if (lParam <> 0)
and (Assigned(FParentForm))
and (Assigned(FChildForm))
then
begin
P := PCWPStruct(lParam);
if (P.
message in [WM_WINDOWPOSCHANGING, SW_MAXIMIZE, SW_MINIMIZE])
and (P.hwnd = FParentForm.Handle)
then
ReadjustChildForm();
end;
Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
end;
end;
Ist daran schon etwas falsch? Ich sehe jedenfalls kein Problem. Wenn ich das Programm jedenfalls ausführe, dann endet es irgendwann in einer
system exception und ich lande im CPU-Fenster der
IDE. Ich glaube, dass das Problem mit WH_CALLWNDPROC zusammenhängt. Komisch ist aber, dass es früher funktioniert hat
Code:
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt C:\Users\Armin\Documents\
RAD Studio\Projekte\tmp\HookDemo\Project1.exe trat ein Problem mit folgender Meldung auf: 'system
exception (code 0xc000041d) at 0x72a64cad'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------
Vielleicht kennt jemand das Problem ja, oder hat Ideen -- ich bin um jede froh!
-- Edit: Anbei mal eine Demo.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)