AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Warum funktioniert mein Keyboard-Hook nicht?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum funktioniert mein Keyboard-Hook nicht?

Ein Thema von F.W. · begonnen am 5. Mär 2008 · letzter Beitrag vom 5. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 07:17
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

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

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 08:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 08:54
HookHandle und ParentHWND sind in allen Prozessen außer in deinem eigenen 0. Somit wird keine message gesendet.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

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

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 08:58
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 09:18
Zitat von F.W.:
Kommt das durch die Initialisierung im var-Bereich?

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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

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

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 09:30
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 09:34
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 09:35
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

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

Re: Warum funktioniert mein Keyboard-Hook nicht?

  Alt 5. Mär 2008, 10:01
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 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