Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hook funktioniert nicht systemweit (https://www.delphipraxis.net/49920-hook-funktioniert-nicht-systemweit.html)

Flips 18. Jul 2005 11:40


Hook funktioniert nicht systemweit
 
Hallo.

Folgendes:
Ich habe mir mal das Hook Tutorial von Luckie (kein Tutorial, Quelltext) und von Assarbad angeschaut.
Habe mir daraus was zusammen geklebt...

Bin auch fast zufrieden, bis auf das der Hook nur dann aktiv ist, wenn mein Programm den Fokus hat.
Wie kann ich den Hook Systemweit aktivieren?
Hab echt keine Ahnung wie das geht... :wiejetzt: :gruebel:

Hier Dll Code:
Delphi-Quellcode:
library TastaturHook;

uses
  Windows,
  Messages;

const
 WM_KEYBOARD_HOOK = WM_USER + 52012;
var
 HookHandle: Cardinal = 0;
 WindowHandle: Cardinal = 0;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE:exit;
    FALSE:
      begin
     PostMessage(WindowHandle,WM_KEYBOARD_HOOK,WParam,LParam);
      end;
  end;
end;


function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
 var keyhooked: boolean;
begin
  keyhooked := false;
if HookHandle = 0 then
begin
 HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);;
 HookHandle:=1;
end;
  WindowHandle := Hwnd;
  Result := keyhooked;
end;

function UninstallHook: Boolean; stdcall;
var keybh: boolean;
begin
  keybh := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
  Result := keybh;
  if Result then WindowHandle := 0;
end;

exports
  InstallHook,
  UninstallHook;

begin

end.
MfG
Flips

Boombuler 19. Jul 2005 07:26

Re: Hook funktioniert nicht systemweit
 
Hi,

daran wirds nicht wirklich liegen aber:

Zitat:

Zitat von Flips
Delphi-Quellcode:
function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
 var keyhooked: boolean;
begin
  keyhooked := false;
if HookHandle = 0 then
begin
 HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);;
 HookHandle:=1;
end;
  WindowHandle := Hwnd;
  Result := keyhooked;
end;

ist nicht wirklich schön, da du den Hook nie wieder unhooken kannst!
du setzt dein HookHandle auf 1 statt den Rückgabewert der SetWindowsHookEx zu verwenden!
Machs doch lieber so:

Delphi-Quellcode:
function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
var UnInst:boolean;
begin
  if HookHandle <> 0 then
    UnInst := UninstallHook;
  else
    UnInst := True;
  HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);
  WindowHandle := Hwnd;
  Result := (HookHandle <> 0) and UnInst;
end;

Robert Marquardt 19. Jul 2005 07:43

Re: Hook funktioniert nicht systemweit
 
Damit sollte es immer noch nicht funktionieren.
Bei globalen Hooks muss man den Hook-Handle in einer Weise aufheben das alle Hook-DLLs ihn benutzen koennen.
Die Hook-DLL wird naemlich allen laufenden Prozessen zugeschlagen und es ist eine Kopie der DLL.
Das Datensegment mit den globalen Variablen ist fuer jede Kopie der DLL separat.
Daraus folgt das nur genau eine Kopie den Hook-Handle hat. Entsprechend funktioniert meistens CallNextHookEx nicht.

Es gibt mehrere Methoden den Hook-Handle geeignet aufzuheben. Ein Shared Segment ist nur mit MS VC++ leicht moeglich.
Peter Vones hat aber ein Tool geschrieben, das es auch fuer Delphi moeglich macht. Siehe Borland Code Central.
Man kann den Hook-Handle aber auch in ein Memory Mapped File stecken.

Flips 19. Jul 2005 13:36

Re: Hook funktioniert nicht systemweit
 
Nach langen überlegen is mit das auch eingefallen. Schon praktisch die MMF´s. Müsste man mal bekannter machen...

Thx @ all.

ps: Programm ist jetzt fertig


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz