Einzelnen Beitrag anzeigen

Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 00:40
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

Hier der Quellcode des Programms:
Delphi-Quellcode:
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.
Und noch der, der HookDll.dll:
Delphi-Quellcode:
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.
Woran liegts? Habs doch eigentlich genau so gemacht wie auf dsdt.info oder in LuckieSpy.
  Mit Zitat antworten Zitat