AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) SetWindowsHookEx innerhalb der DLL selbst
Thema durchsuchen
Ansicht
Themen-Optionen

SetWindowsHookEx innerhalb der DLL selbst

Ein Thema von hedie · begonnen am 23. Mär 2013 · letzter Beitrag vom 25. Mär 2013
Antwort Antwort
Seite 1 von 2  1 2      
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#1

SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 11:22
Hallo zusammen

Ich würde gerne prüfen ob irgendwo eine bestimmte Tastenkombination gedrückt worden ist.

Dazu habe ich versucht innerhalb einer DLL selbst, einen Hook zu setzen.

Hier mein Code:

Delphi-Quellcode:

var
MainHook : HHOOK;
//...

function KeyboardHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall;
begin
  MessageBox(HWND_DESKTOP,Pchar('Wir sind im Hook!'),'Message',MB_ICONINFORMATION);
end;

//....


MainHook := SetWindowsHookEx(WH_KEYBOARD, KeyboardHook, hinstance, 0);

  if MainHook = 0 then begin
    MessageBox(HWND_DESKTOP,Pchar('Fehlerhafter Hook!'),'Message',MB_ICONINFORMATION);
  end
  else begin
     MessageBox(HWND_DESKTOP,Pchar('Hook erfolgreich!'),'Message',MB_ICONINFORMATION);
  end;
Dieser Code wird automatisch beim Laden der DLL ausgeführt.

Ich bekomme auch die Meldung : Hook erfolgreich
aber leider bekomme ich nie die Meldung: Wir sind im Hook!

Es scheint so, als ob ich keinen echten Hook gesetzt hätte. Woran liegt das?

Danke schonmal
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 11:30
Geht es um einen KeyboardHook oder um einen Hook in einer DLL?

Für Mouse- und Keyboard-Hook wird keine DLL benötigt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#3

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 11:36
Hallo Rufo

Es geht im grunde um einen KeyboardHook

Aber ich möchte diesen KeyboradHook innerhalb einer DLL setzen.
Damit meine ich, Das erstellen des Hooks soll innerhalb der DLL geschehen
und die bearbeitende Hookfunktion soll sich ebenfalls in dieser DLL befinden...

Also mein Programm ist sozusagen die DLL...

Ich hoffe du verstehst was ich meine
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 11:49
Ich kann wahrscheinlich nichts konstruktives beitragen, nur anmerken, dass ich die Routine nicht einfach so, sondern deren Adresse an SetWindowsHookEx übergeben habe...

Und es waren keine Keyboard-Events, sondern Lowlevel-Keyboard-Events (WH_KEYBOARD_LL statt WH_KEYBOARD )
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#5

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 11:51
Ich kann wahrscheinlich nichts konstruktives beitragen, nur anmerken, dass ich die Routine nicht einfach so, sondern deren Adresse an SetWindowsHookEx übergeben habe...

Und es waren keine Keyboard-Events, sondern Lowlevel-Keyboard-Events (WH_KEYBOARD_LL statt WH_KEYBOARD )
Jede Antwort ist hilfreicht

Das wollte ich auch schon versuchen... Aber dann kommt leider das:

Code:
[DCC Fehler] Project.dpr(42): E2003 Undefinierter Bezeichner: 'WH_KEYBOARD_LL'
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 11:58
Das hatte ich auf einem älteren Delphi (6?) auch, der kannte die Konstante einfach noch nicht.

Nimm stattdessen einfach die 13, wie du auf MSDN nachlesen kannst
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#7

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 12:01
Das hatte ich auf einem älteren Delphi (6?) auch, der kannte die Konstante einfach noch nicht.

Nimm stattdessen einfach die 13, wie du auf MSDN nachlesen kannst
Hab ich nun versucht...

Leider bekomme ich nach einem Tastendruck in der Host-Anwendung immer noch keine Meldung meiner DLL

Delphi-Quellcode:

function KeyboardHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall;
begin
  MessageBox(HWND_DESKTOP,Pchar('Wir sind im Hook'),'Message',MB_ICONINFORMATION);
end;

//...

MainHook := SetWindowsHookEx(13, KeyboardHook, hinstance, 0);
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.633 Beiträge
 
Delphi 12 Athens
 
#8

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 12:06
Geht es um einen KeyboardHook oder um einen Hook in einer DLL?

Für Mouse- und Keyboard-Hook wird keine DLL benötigt
Hast du Beispiele für Mouse und Keyboard Hook ohne DLL? Ich habe zum Test eine DLL gefunden, wo aber keine Service mehr existiert. Wenn ich das direkt in Delphi machen könnte, wäre das super.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#9

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 12:13
Ok nun habe ich news....

Der hook schein doch so halbwegs zu klappen...

Bei mir kommt einmalig die meldung: wir sind im hook.
Direkt nach dem einklinken mit

MainHook := SetWindowsHookEx(13, KeyboardHook, hinstance, 0); Doch danach kann ich den Hook nicht mehr auslösen...
Die frage ist nur, weshalb.

Hier mein DLL-Code

Delphi-Quellcode:
begin

  MainHook := SetWindowsHookEx(13, KeyboardHook, hinstance, 0);

  if MainHook = 0 then begin
    MessageBox(HWND_DESKTOP,Pchar('Fehlerhafter Hook!'),'Message',MB_ICONINFORMATION);
  end
  else begin
     MessageBox(HWND_DESKTOP,Pchar('Hook erfolgreich!'),'Message',MB_ICONINFORMATION);
  end;

end.
Wird die DLL nach end. irgendwie beendet und kann deshalb keine messages vom system mehr empfangen?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#10

AW: SetWindowsHookEx innerhalb der DLL selbst

  Alt 23. Mär 2013, 12:35
Wenn ich die erste Meldung, dass der Hook erfolgreich erstellt wurde, nicht bestätige,

Dann funktionieren die Keyboardhooks.

Sobald ich jedoch ok klicke. Funktioniert es nicht.

Wird die DLL also irgendwie beendet?

Wenn ja, wie kann ich die DLL in einem art IDLE Modus belasse, so dass die Hooks weiterhin funktionieren?
Oder irgendwas wie StayAlive ?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  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 21:33 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