![]() |
Tastatur Hook funktioniert nicht richtig
Hallo,
Ich wollte mich mal in das Thema Hooks einarbeiten und habe zum Anfang mal mit einem vermeindlich einfachen Tastaturhook ausprobiert. Allerdings funktioniert der Hook nicht wie gewollt. Hier zunächst einmal der Code der DLL:
Code:
Zum Anfang habe ich in der KeyboardHookProc zunächst einmal versucht die Tastatureingabe auszuwerten und bei bestimmten Tasteneingaben eine andere Taste zurück zu geben. Wird eine Taste mit einem Zeichencode kleiner 100 gedrückt, soll immer die Taste mit dem Code 81 zurück gegeben werden. Wird eine Taste mit einem Code >= 100 gedrückt wird an der Eingabe nichts geändert.
library KeyboardHook;
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; hook:cardinal; hwnd:cardinal; hopenfilemap:cardinal=0; p:pointer; switch:boolean; hcreatefilemap:cardinal=0; oldproc:pointer; function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin //es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen //it's possible to call CallNextHookEx conditional only. case nCode < 0 of TRUE: exit; //wenn code kleiner 0 wird nix gemacht //if code smaller 0 nothing has to be done FALSE: begin Showmessage(inttostr(wparam)); if (wParam<100)then Result := CallNextHookEx(HookHandle, nCode, 81, 81) //Wenn Tastaturcode kleiner 100, den Code auf 81 ändern else Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); //Wenn größer 100, die gedrückte Taste zurück geben end; end; end; function InstallHook(Hwnd: Cardinal): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin //Erstmal Hook installieren //First install the hook HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); //Uebergebenes Fensterhandle sichern //Save the given window handle WindowHandle := Hwnd; Result := TRUE; end; end; function UninstallHook: Boolean; stdcall; begin //Hook aus der Hookchain entfernen //Uninstall hook from hook chain Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; exports //Installations- und Deinstallationsroutine exportieren //Export the installation and deinstallation routine InstallHook, UninstallHook; end. Soweit die Theorie, allerdings funktioniert der Hook nicht richtig. Es wird nämlich mit obigem Code immer die gedrückte Taste zurück gegeben :-( Die KeyboardHookProc wird richtig durchlaufen, das habe ich mit eingebauten Showmessage() zu debuggen schon getestet und wenn der Code <100 wird auch die richtige if schleife durchlaufen aber die Tastatur eingabe wird nicht geändert. Noch seltsamer ist aber folgendes: Wenn ich in die entsprechende if-else-Schleife zum debuggen jeweils eine Showmessage einbaue funktioniert auf einmal alles wie gewollt:
Code:
Hat jemand eine Idee wodran das liegen könnte?
if (wParam<100)then
begin Showmessage('Ein'); Result := CallNextHookEx(HookHandle, nCode, 81, 81) end else begin Showmessage('Aus'); Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); end; PS: Bevor jemand fragt, welchen Sinn dieser Hook überhaupt haben soll: Garkeinen! Ich wollte nur zum Anfang mal probieren wie ich die Eingaben auslesen und dann auch verändert zurück geben kann. |
AW: Tastatur Hook funktioniert nicht richtig
Eigentlich kann man in der "KeyboardHookProc" nur zurückgeben, ob die Taste durch den Hook bearbeitet wurde und von der Anwendung deshalb ignoriert werden soll. Eine Änderung des Codes ist nicht möglich.
Der Aufruf von "CallNextHookEx" dient nur dazu weitere "KeyboardHookProc" zu bedienen, die sich ebenfalls für die gedrückten Tasten interessieren. Wenn z.B. ein Utilitie auf die "Druck"-Taste mit einem Screenshoot reagiert, könnte man dieses auslösen, in dem man den entspechenden Tastencode weitergibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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