![]() |
Warum funktioniert mein Keyboard-Hook nicht?
Ich wollte schon vor langer Zeit mich mal mit Hooks beschäftigen, welche bei mir aber nie funktioniert haben. Jetzt habe ich mal wieder damit angefangen und ich bin scheinbar immernoch zu dumm dazu :-(
Der Hook funktioniert, aber leider nur, solange meine Anwendung aktiv ist, sprich mein globaler Hook zeigt sich ziemlich lokal :roll: Hier der Quellcode des Programms:
Delphi-Quellcode:
Und noch der, der HookDll.dll:
unit HookForm_Unit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math; type THookForm = class(TForm) Label1: TLabel; AltLbl: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure OnUserMsg(var Msg: TMessage); message WM_USER+10; { Private-Deklarationen } public { Public-Deklarationen } end; var HookForm: THookForm; InstallHook: function(AHWND: HWND): Boolean; stdcall; UninstallHook: function: Boolean; stdcall; lib: Cardinal; implementation {$R *.dfm} function ZweiHoch(X: Integer): Integer; begin Result := Round(Ldexp(1, X)); end; procedure THookForm.OnUserMsg(var Msg: TMessage); begin // Label1.Caption := IntToStr(Msg.LParam); if (Msg.lParam and Zweihoch(24)) <> ZweiHoch(24) then HookForm.Label1.Caption := IntToStr(Msg.wParam)+' - '+Chr(Msg.wParam); HookForm.AltLbl.Visible := (msg.lParam and ZweiHoch(29)) = ZweiHoch(29); end; procedure THookForm.FormCreate(Sender: TObject); begin lib := LoadLibrary('HookDll.dll'); if lib <> INVALID_HANDLE_VALUE then begin @InstallHook := GetProcAddress(lib, 'InstallHook'); @UnInstallHook := GetProcAddress(lib, 'UnInstallHook'); InstallHook(HookForm.Handle); end; end; procedure THookForm.FormDestroy(Sender: TObject); begin UnInstallHook; end; end.
Delphi-Quellcode:
Woran liegts? Habs doch eigentlich genau so gemacht wie auf dsdt.info oder in LuckieSpy.
library HookDll;
uses Windows, Messages; {$R *.res} var HookHandle: Cardinal = 0; ParentHWND: HWND = 0; function KeyBoardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); if nCode >= 0 then begin if ParentHWND <> 0 then SendMessage(ParentHWND, WM_USER+10, wParam, lParam); end; end; function InstallHook(Parent: HWND): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyBoardHookProc, HInstance, 0); ParentHWND := Parent; Result := True; end; end; function UnInstallHook: Boolean; stdcall; begin Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; exports InstallHook, UnInstallHook; begin end. |
Re: Warum funktioniert mein Keyboard-Hook nicht?
Zitat:
Delphi-Quellcode:
.
procedure THookForm.FormDestroy(Sender: TObject); begin UnInstallHook; end; end. Hier wird der Hook ja wieder deinstalliert. |
Re: Warum funktioniert mein Keyboard-Hook nicht?
Zitat:
Solange meine Anwendung den Eingabefocus besitzt, im Vodergrund ist etc. Ich hatte auch schon einmal eine Variante ohne der WM_USER+10 Message drin, da hat die Dll das Formular erzeugt und die Buchstaben angezeigt. Resultat da war, dass es nur solange ging, bis das Dll-Formular das erste Mal den Foucs verloren hat, selbst wenn es dann den Focus wiederbekommen hat, ging es nicht mehr. |
Re: Warum funktioniert mein Keyboard-Hook nicht?
HookHandle und ParentHWND sind in allen Prozessen außer in deinem eigenen 0. Somit wird keine message gesendet.
|
Re: Warum funktioniert mein Keyboard-Hook nicht?
Zitat:
|
Re: Warum funktioniert mein Keyboard-Hook nicht?
Zitat:
Zitat:
Die einfachste und am weitest verbreitete Methode ist über MMF zu arbeiten. |
Re: Warum funktioniert mein Keyboard-Hook nicht?
Zitat:
Wie wird denn meine Dll "komplett" in andere Prozesse geladen? Nur wenn diese LoadLibrary() aufrufen würde? |
Re: Warum funktioniert mein Keyboard-Hook nicht?
Selbst mit LoadLibrary geladene DLLs haben für die Variablen eigene Speicherbereiche in den Prozessen.
mit den durch Hooks geladenen DLLs ist es wie mit einem Programm was man mehrfach startet. Man muss sich selbst darum kümmern wie man die Daten zwischen den Prozessen austauscht. Zitat:
|
Re: Warum funktioniert mein Keyboard-Hook nicht?
MMFs sind nicht schwer, da gibt es mehrere Beispiele in der DP
Wie globale Variablen einer DLL in verschiedenen Prozessen gehandhabt werden weiß ich nicht. Ich würde meinen, dass jeder Prozess seine eigene globale Varibale hat. Hab aber keine Ahnung. Da fehlt mit auch das Wissen, wie das Windows machen sollte/könnte. Wobei, vielleicht landen deine globalen Variablen sogar in allen Prozessen, aber jeder Przoess halt mit seiner eigenen Variable. |
Re: Warum funktioniert mein Keyboard-Hook nicht?
Zitat:
Nagut, dann werde ich mich damit anfreunden. Vielleicht liegts ja daran, dass ich bisher noch nicht gesehen habe, wofür es genau nützlich ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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