Einzelnen Beitrag anzeigen

Phil1977

Registriert seit: 14. Feb 2010
8 Beiträge
 
#1

Tastatur Hook funktioniert nicht richtig

  Alt 7. Aug 2012, 09:25
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.
  Mit Zitat antworten Zitat