AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Message wird nicht gesendet bei globalem Hook
Thema durchsuchen
Ansicht
Themen-Optionen

Message wird nicht gesendet bei globalem Hook

Ein Thema von idontwantaname · begonnen am 11. Aug 2006 · letzter Beitrag vom 11. Aug 2006
Antwort Antwort
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#1

Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 14:37
Hallo !!

Ich habe mich heute mit Hooks beschäftigt und bin auf diesesHook Tutorial gestoßen. Und das ganze funktioniert schon ganz gut. Bei globalen Hooks empfiehlt der Autor, per MMF Daten an die eigene Anwendung zu schicken. Mir war das zu kompliziert, deshalb habe ich überlegt, ich schicke meinem Fenster einfach eine Message (WM_USER + x) und passe den wParam und lParam nach meinen Wünschen an. Das funktioniert auch, aber nur so lange meine eigene Form im Vordergrund ist.
Das ist natürlich sehr seltsam. Zum schicken der Nachricht verwende ich SendMessage. Der Fehler liegt auch bei dieser Funktion, denn die Hook-Prozedur wird auch ausgeführt, wenn mein Fenster im Hintergrund ist.

Hier mal ein bisschen Code, vielleicht hilft er euch ja weiter.
Delphi-Quellcode:
// aus der DLL

const
  WM_MOUSEHOOKMSG = WM_USER + 1;

var
  GlobalHooksFormHandle: HWND = 0;
  MouseHookHandle: HHOOK = 0;

function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  LMouseHookStruct: TMouseHookStruct;
  LMousePositionX: Integer;
  LMousePositionY: Integer;
begin
  if nCode = HC_ACTION then
  begin
    LMouseHookStruct := PMouseHookStruct(lParam)^;
    LMousePositionX := LMouseHookStruct.pt.X;
    LMousePositionY := LMouseHookStruct.pt.Y;

    if GlobalHooksFormHandle <> 0 then
      SendMessage(GlobalHooksFormHandle, WM_MOUSEHOOKMSG, LMousePositionX, LMousePositionY);
  end;

  Result := CallNextHookEx(MouseHookHandle, nCode, wParam, lParam);
end;

function InstallHooks(AGlobalHooksFormHandle: HWND): Boolean; stdcall;
var
  LMouseHookProc: TFNHookProc;
begin
  GlobalHooksFormHandle := AGlobalHooksFormHandle;

  LMouseHookProc := MouseHookProc;
  MouseHookHandle := SetWindowsHookEx(WH_MOUSE, LMouseHookProc, HInstance, 0);

  Result := MouseHookHandle <> 0;
end;
Habt ihr Ideen, wieso er die Message nicht mehr schickt ??

Falls euch der Code nicht reicht, ich hab mal die ganze Projektgruppe angehängt.

Vielen Dank schon mal im Voraus,
Oliver
Angehängte Dateien
Dateityp: rar globalhooks_957.rar (187,1 KB, 6x aufgerufen)
Oliver Hanappi
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 15:58
du könntest versuchen, als Nachricht eine mit RegisterWindowMessage erzeugte Nachricht zu benutzen. WM_USER+x wird nur empfohlen, wenn du in deinen threads rumfunkst und nicht zwischen prozessen.

Außerdem solltest du GlobalHooksFormHandle mal protokollieren(in eine datei schreiben z.B.), es könnte sein, dass die nicht immer den richtigen Wert hat. am besten per Broadcast suchen (und dann auf jeden fall mit RegisterWindowMessage).

Broadcasts kommen übrigens nur bei top-level windows an, also im Application.OnMessage!
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:09
Genau aus dem Grund nimmt der Author mmf's.

Wenn du einen Hook "installierst" wird die DLL in die verschiedensten Prozesse geladen. Beim laden der DLL in den verschiedenen Prozessen ruft jedoch niemand deine Methode InstallHooks auf. Die Methode InstallHooks wird einzig in der DLL-Instanz geladen welche du in deinem Programm lädst. Wenn deine DLL als in der Explorer.exe geladen wird, wird dort sozusagen nur ein LoadLibrary gemacht und ein lokaler Hook auf deine DLL-Procedure. Es wird bei einem SetWindowsHook-Aufruf also nix anderes gemacht als
- Lade in so ziemlich jedem Prozess die DLL "DeineDLL.DLL" und schleife alle Nachrichten durch die Funktion MouseHookProc der DLL.
Es wird also darin nirgends deine Variable GlobalHooksFormHandle gesetzt, das geschieht einzug und allein in der DLL instanz die du in deinem Programm lädst.

Dir scheint also das Verständnis zu fählen was genau bei einem hook-setzen passiert.

Dein Code kommt ungefähr dem gleich:
Du hast einen Notizblock und schreibst eine Telefonnummer drauf.
Dann sagst du all deinen Freunden Sie sollen sich auch einen Notizblock vom Stabel nehmen und alles was passiert sollen sie telefonisch an die auf dem Block vermerkte Nummer übermitteln. Das Problem: Die telefonnummer steht nur auf deinem Block.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:13
jop, das liegt daran, dass die DLLs nicht den selben speicher benutzen. Ein Feature, das Delphi einfach fehlt. (Liegt das nicht am MemoryManager? Kann das nicht z.B. FastMM?)
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:17
@DGL-Luke: Nein, das ist kein Problem vom Delphimemorymanager. Wie bereits geschrieben wird die DLL bei einem Aufruf von SetWindowsHookEx in jedem Prozess neu geladen, so als würde in dem Prozess jemand einen lokalen Hook mit SetWindowsHookEx starten. Ein globaler Hook ist sozusagen ein Rundruf das so ziemlich jeder einen Lokalen Hook auf die Adresse-X in der DLL-X setzen soll. Dabei laden dann die Prozesse die DLL und setzen eben einen lokalen Hook auf die Funktion.

Einziges was es in Delphi nicht gibt (was in C++ wohl einfacher gelöst ist) das es da gemeinsam genutzen Speicher ohne den Umweg über mmf's gibt.

Das ganze ist aber auch logisch, denn wenn die Messages von anderen Prozessen an die Hook-Procedure des geinen Prozesses übergeben werden würden wären die Adressen welche sich teilweise in WParam und LParam befinden völlig nutzlos da die Adressen nur im anderen Prozess gültig sind (also in dem Prozess wo sie her kommen).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:19
Okay, danke

Jetzt weiß ich wo mein Problem liegt, und werde einen anderen Weg nehmen.

mfg Oliver
Oliver Hanappi
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:22
Zitat:
Einziges was es in Delphi nicht gibt (was in C++ wohl einfacher gelöst ist) das es da gemeinsam genutzen Speicher ohne den Umweg über mmf's gibt.
Das meinte ich... dann würde in InstallHook das richtige Handle gesetzt und die anderen könnten es einfach benutzen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  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: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:26
aber eben auch nur wenn die Variable in C++ so speziell deklariert wäre das sie im gemeinsam genutzten speicher liegt. Und dementsprechend kann man das in Delphi durch mmf's auch erreichen.

ich habs bei meinen Programmen wenn ich sowas braucht bisher immer im Hauptprogramm ein mmf angelegt und das Handle rein geschrieben. Die DLL's haben dann beim laden (also zwischen begin und end) das mmf geöffnet und das handle gelesen und dann auch mit sendmessage kommuniziert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Message wird nicht gesendet bei globalem Hook

  Alt 11. Aug 2006, 16:55
Ich hab's jetzt so gemacht, dass im Ladeabschnitt der DLL per FindWindow mein Handle gesucht wird.
Oliver Hanappi
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:54 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