Thema: Mehrere Hooks

Einzelnen Beitrag anzeigen

golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#1

Mehrere Hooks

  Alt 10. Jul 2012, 09:16
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?
  Mit Zitat antworten Zitat