AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

hInstance - KeyboardHook

Ein Thema von napsterxx · begonnen am 30. Jul 2008 · letzter Beitrag vom 24. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#1

hInstance - KeyboardHook

  Alt 30. Jul 2008, 16:59
Moin Moin,
dachte ich beschäftige mich mit Hooks - und habe es eigentlich soweit auch verstanden, jedoch kann ich wenn ich die Tastatur hooke nur Tasten abfangen die auf meiner Form gedrückt wurden!?!?

Ich denke es liegt an hInstance im Quellcode der DLL.

DLL QuellCode:
Delphi-Quellcode:
library KeyboardHook;

uses
  Windows, SysUtils,
  Messages;

{$R *.res}

var
  HookHandle: Cardinal = 0;
  SendHwnd: Cardinal;

const
  MM_KeyDown = 2072;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx( HookHandle, nCode, wParam, lParam );
  case nCode < 0 of
    True: Exit;
    False:
      begin
        SendMessage( SendHwnd, MM_KeyDown, wParam, lParam );
      end;
  end;
end;


function InstallHook( Hwnd, ResultHwnd: Cardinal ): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then
  begin
    HookHandle := SetWindowsHookEx( WH_KEYBOARD, @KeyboardHookProc, hInstance, 0 );
    SendHwnd := ResultHwnd;
    Result := True;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
  InstallHook,
  UninstallHook;

begin
end.
HauptProgramm QuellCode:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure btnUninstallClick(Sender: TObject);
    procedure btnInstallClick(Sender: TObject);
  protected
    { Protected-Deklarationen }
    procedure WndProc(var Msg: TMessage); override;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

const
  MM_KeyDown = 2072;

function InstallHook( Hwnd, ResultHwnd: THandle ): Boolean; stdcall;
  external 'KeyboardHook.dll';
function UninstallHook: Boolean; stdcall;
  external 'KeyboardHook.dll';

implementation

{$R *.dfm}

// Nachricht verarbeiten
procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = MM_KeyDown) then
    Form1.Caption := IntToStr( Msg.WParam );
end;

// Hook installieren
procedure TForm1.btnInstallClick(Sender: TObject);
begin
  InstallHook( Handle, Handle );
end;

// Hook deinstallieren
procedure TForm1.btnUninstallClick(Sender: TObject);
begin
  UninstallHook;
end;

end.
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:05
Zitat von napsterxx:
Delphi-Quellcode:
// Hook installieren
procedure TForm1.btnInstallClick(Sender: TObject);
begin
  InstallHook( Handle, Handle );
end;
du installierst den hook ja auch nur für dein hauptfenster!!
hast dus mal mit "0" probiert??
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:19
Quatsch, der Hook wird global installiert. Das Problem ist, dass die globalen Variablen nur in einer DLL-Instanz zur Verfügung stehen. Was soll eigentlich die Variable WindowHandle?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:23
Die ist überflüssig
Ich editiere mal
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:35
Um das eigentliche Problem zu behandeln, darfst du das Ziel deiner Nachrichten nicht mehr aus globalen Variablen ermitteln. Du kannst FindWindow verwenden oder deine Nachrichten an HWND_BROADCAST schicken, da gibt es allerdings ein paar Dinge zu beachten. Sehr interessant dürfte auch die Möglichkeit sein, Mailslots zu verwenden. Diese sind hier eigentlich ideal.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:40
Du meinst ich muss das Sendmessage verändern? Bzw. Komplett rausstreichen?
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:43
Wie gesagt, die globale Variable hat in fast allen DLL-Instanzen den Wert 0. Du musst das Handle daher entweder dynamisch ermitteln oder einen anderen Weg gehen. Einige habe ich oben bereits aufgezeigt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:51
Welche Variable? Meine Form erhält ja die gewünschte Info mit der gedrückten Taste
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 17:55
Die Variable SendHwnd. Nur in der DLL-Instanz deines eigenen Programmes wird ihr ein Wert zugewiesen. In allen anderen Instanzen bleibt sie 0. Daher kommt aus diesen auch nichts an.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: hInstance - KeyboardHook

  Alt 30. Jul 2008, 18:19
Ah danke dir, nun habe ich es verstanden Dann werde ich wohl mir etwas anderes überlgen ^^
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  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 22:28 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