Hallo,
ich habe das Problem, dass wenn ich in einer
DLL mehrere Hooks installiere, diese
dann nicht funktionieren.
Installiere ich nur den einen oder den anderen funktioniert es.
DLL:
Delphi-Quellcode:
function InstallHookProcWnd: HINST; stdcall;
begin
Result := 0;
try
begin
if HookHandleMsg = 0 then
begin
HookHandleMsg := SetWindowsHookEx(WH_CALLWNDPROC, @WndHookProc,
HInstance, 0);
end
else MessageBox(0,'WndHook bereits installiert','Info',0);
end;
except MessageBox(0,'Wnd-Hook konnte nicht installiert werden!','Info',0);
end;
Result := hInstance;
end;
// ----------------------------------------------------------------------
function InstallHookProcMsg: HINST; stdcall;
begin
Result := 0;
try
begin
if HookHandleMsgC = 0 then
begin
HookHandleMsgC := SetWindowsHookEx(WH_GETMESSAGE , @GetMsgProc,
hInstance, 0);
end
else MessageBox(0,'Msg-Hook bereits installiert','Info',0);
end;
except MessageBox(0,'Msg-Hook konnte nicht installiert werden!','Info',0);
end;
Result := hInstance;
end;
In einem Testprogramm starte ich die Hooks so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
InstallHookWnd : TInstallHookWnd;
InstallHookMsg : TInstallHookMsg;
begin
hLibInWnd := LoadLibrary('QsTools.dll');
if hLibInWnd <> 0 then
begin
@InstallHookWnd := GetProcAddress(hLibInWnd, 'InstallHookProcWnd');
if not Assigned(InstallHookWnd) then exit;
end
else
begin
showmessage('Hook nicht installiert');
exit;
end;
hLibInMsg := LoadLibrary('QsTools.dll');
if hLibInMsg <> 0 then
begin
@InstallHookMsg := GetProcAddress(hLibInMsg, 'InstallHookProcMsg');
if not Assigned(InstallHookMsg) then exit;
end
else
begin
showmessage('Hook nicht installiert');
exit;
end;
InstallHookMsg;
InstallHookWnd;
end;
Kommentiere ich einen der beiden Funktionsaufrufe aus, tut der aktive Hook was er soll.
Ich brauche zwei Hooks weil ich auf verschiedene Messages reagieren muss.
WH_CALLWNDPROC brauche ich um auf WM_INITMENU reagieren zu können.
WH_GETMESSAGE brauche ich um auf den Klick eines Menüitems reagieren zu können.
Der WM_COMMAND eines Menuitems kommt beim WH_CALLWNDPROC nicht an, weil
Menübefehle gepostet und nicht gesendet werden. (deshalb der WH_GETMESSAGE)
Ich habe die hInstance-Variable in Verdacht. Da die ja nur einmal vorhanden ist, wird sie
durch den zweiten Hook überschrieben.
Definiere ich mir selber zwei Variablen und verwende diese, tut sich gar nix!
Hat jemand einen Tipp?