Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Warum funktioniert mein Keyboard-Hook nicht? (https://www.delphipraxis.net/109632-warum-funktioniert-mein-keyboard-hook-nicht.html)

F.W. 4. Mär 2008 23:40


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:
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.

Sharky 5. Mär 2008 06:17

Re: Warum funktioniert mein Keyboard-Hook nicht?
 
Zitat:

Zitat von F.W.
...solange meine Anwendung aktiv ist, ...

Wenn Du mit "aktiv" meinst das deine Anwendung gestartet ist:
Delphi-Quellcode:
.
procedure THookForm.FormDestroy(Sender: TObject);
begin
 UnInstallHook;
end;

end.

Hier wird der Hook ja wieder deinstalliert.

F.W. 5. Mär 2008 07:50

Re: Warum funktioniert mein Keyboard-Hook nicht?
 
Zitat:

Wenn Du mit "aktiv" meinst das deine Anwendung gestartet ist:
Das aktiv ist vielleicht etwas unglücklich ausgedrückt.
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.

SirThornberry 5. Mär 2008 07:54

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.

F.W. 5. Mär 2008 07:58

Re: Warum funktioniert mein Keyboard-Hook nicht?
 
Zitat:

HookHandle und ParentHWND sind in allen Prozessen außer in deinem eigenen 0.
Kommt das durch die Initialisierung im var-Bereich? Denn die var-Variablen haben doch sonst für alle Prozesse den gleichen Inhalt oder lebe ich da seitdem ich Dlls schreiben kann in einer Illusion?

sirius 5. Mär 2008 08:18

Re: Warum funktioniert mein Keyboard-Hook nicht?
 
Zitat:

Zitat von F.W.
Kommt das durch die Initialisierung im var-Bereich?


Zitat:

Zitat von F.W.
Denn die var-Variablen haben doch sonst für alle Prozesse den gleichen Inhalt oder lebe ich da seitdem ich Dlls schreiben kann in einer Illusion?

Nur wenn die gesamte DLL in alle Prozesse gemappt wird. Hier wird aber nur die Funktion in alle Prozesse gemappt.
Die einfachste und am weitest verbreitete Methode ist über MMF zu arbeiten.

F.W. 5. Mär 2008 08:30

Re: Warum funktioniert mein Keyboard-Hook nicht?
 
Zitat:

Die einfachste und am weitest verbreitete Methode ist über MMF
Hmm, das kann ich derzeit noch nicht. Gibts noch andere Wege?
Wie wird denn meine Dll "komplett" in andere Prozesse geladen? Nur wenn diese LoadLibrary() aufrufen würde?

SirThornberry 5. Mär 2008 08:34

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:

Hmm, das kann ich derzeit noch nicht
Was spricht dagegen sich damit zu beschäftigen? Irgendwann wusstest du auch nicht wie man einen Hook installiert. Durch recherchen/copy&paste hast du es dann auch irgendwann raus gefunden.

sirius 5. Mär 2008 08:35

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.

F.W. 5. Mär 2008 09:01

Re: Warum funktioniert mein Keyboard-Hook nicht?
 
Zitat:

Was spricht dagegen sich damit zu beschäftigen?
Ich weiß nicht so recht, ich hab intuitiv eine Abneigung dagegen, ohne dass ich es richtig kenne ^^
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.
Seite 1 von 2  1 2      

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