Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Tastatur Hook funktioniert nicht richtig (https://www.delphipraxis.net/169711-tastatur-hook-funktioniert-nicht-richtig.html)

Phil1977 7. Aug 2012 08:25

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:
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.
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.
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:
 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;
Hat jemand eine Idee wodran das liegen könnte?

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.

Blup 7. Aug 2012 09:57

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 06:22 Uhr.

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