![]() |
"Da ist ein Haken an meinem Haken" (warum spinnt m
Also, hallo DP erstmal,
Ich habe einen kleinen Kampf mit einem Hook, den ich mir seit gestern angeschaut habe - und dessen Source ich auch so weit verstanden habe. Angelehnt ist das Ding an ein Tutorial von assarbad.net. Hier isset: Meine "KeyboardHook.dll":
Delphi-Quellcode:
Und meine Routine im Hauptformular:
library KeyboardHook;
uses SysUtils, Windows, Messages; var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin //es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen //it's possible to call CallNextHookEx conditional only. Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; //wenn code kleiner 0 wird nix gemacht FALSE: begin BringWindowToTop(WindowHandle); if(lParam>0) then SendMessage(WindowHandle, WM_KEYDOWN, wParam+1, 0) else SendMessage(WindowHandle, WM_KEYUP, wParam+1, 0); //Hier kann jetzt alles bearbeitet werden //Here one can work with the parameters end; end; end; function InstallHook(Hwnd: THandle): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin //Erstmal Hook installieren //First install the hook HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); //Uebergebenes Fensterhandle sichern //Save the given window handle WindowHandle := Hwnd; Result := TRUE; end; end; function UninstallHook: Boolean; stdcall; begin //Hook aus der Hookchain entfernen //Uninstall hook from hook chain Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; exports //Installations- und Deinstallationsroutine exportieren //Export the installation and deinstallation routine InstallHook, UninstallHook; end.
Delphi-Quellcode:
Dann erstmal folgendes vorweg: Überraschenderweise hat alles so weit funktioniert, nachdem ich mir das so weit zurechtgeschnippselt hatte.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin ListBox1.Items.Add(inttostr(Key)); Caption:=inttostr(Key); end; In meiner Euphorie bin ich zu meinem Firefox gegangen und hab ihm einige Tastenanschläge verpasst. Davon hat mein Programm aber offensichtlich gar nichts mitbekommen :( Nun will ich allerdings meinem Prog auch die Tastendrücke nicht vorenthalten, die in anderen Programmen gemacht wurden. Also will dem HP von überall her sagen, dass Taste(n) gedrückt wurden (oder was ich sonst irgendwann mal brauche, ich find das Thema halt erstmal toll^^) Kennt sich wer besser damit aus als ich? Leitfragen also: Warum kommen meine Messages nicht an? Werden die überhaupt gesendet? Muss ich mich da tiefer in IPC einarbeiten? Ich dachte, Messages an ein (Fenster-)Handle zu senden, würde immer funktionieren!? (Wenn ja, wäre das nicht schlimm, mich weiter zu informieren, bin grade nur etwas ratlos, nich faul:D) Grüße vom LDer |
Re: "Da ist ein Haken an meinem Haken" (warum spin
Deine Variable WindowHandle wird nicht in die verschiedenen DLL-Instanzen übertragen; der Wert ist nur in der DLL vorhanden, die in dein eigenes Programm geladen wird.
|
Re: "Da ist ein Haken an meinem Haken" (warum spin
und kann es sein, daß du deine KeyboardHook.dll nur in einen eigenen Prozess injeziert hast?
Du mußt diese natürlich dann auch in allen anderen Programme reinschieben. (inkl. dem, was Apollonius sagte) |
Re: "Da ist ein Haken an meinem Haken" (warum spin
Zitat:
SetWindowHookEx() setzt einen globalen Hook, wenn der letzte Parameter = 0 ist; Bei einem globalen Hook wird die dll automatisch in alle Processe "attached" @ThreadStarte: Hör auf Apollonius's Rat. MfG |
Re: "Da ist ein Haken an meinem Haken" (warum spin
Wenn ich zB statt SendMessage eine ShowMessage(egal welcher Inhalt) aufrufe, geht das von überall. Dann siehts teilweise so aus, als ob die Meldungen direkt vom Firefox o.ä. kämen... is ganz lustig :stupid:
Aber was will ich damit? ich will keinen Firefox der mich sinnlos mit leeren ShowMessages zuspammt :snowball: Ich will, dass diese SendMessages gemacht werden... ;) keine ShowMessages {wie oft will ich mich jetzt noch wiederholen? :D} Also scheinbar wird die Funktion schon von anderen DLLs aufgerufen, aber @Apollonius: Wie krieg ich es dann hin, dass das Handle dann immer da is wo es hingehört? |
Re: "Da ist ein Haken an meinem Haken" (warum spin
du sendest die Nachrichten an WindowHandle ... in welchem du aber anscheinend das Handle des LOKALEN Fensters gesetzt hast ... stattdessen mußt du es an DEIN Fenster schicken lassen.
|
Re: "Da ist ein Haken an meinem Haken" (warum spin
Du kannst dein Fensterhandle offensichtlich nicht in einer globalen Variablen speichern. Du kannst aber beispielsweise über eine Datei oder über einen Mailslot mit dem Hauptprogramm kommunizieren. Alternativ suchst du einfach mittels FindWindow dein Fenster.
|
Re: "Da ist ein Haken an meinem Haken" (warum spin
oder per IPC;
Das müsste aber alles im Tutorial drin' stehen MfG |
Re: "Da ist ein Haken an meinem Haken" (warum spin
Zitat:
Edit: Okay habs getestet. Ist natürlich nicht so. Hatte mich schon gewundert, weil man dann dadurch ja total simple globale DLL Injections hätte realisieren können :) |
Re: "Da ist ein Haken an meinem Haken" (warum spin
Ist das wirklich nicht so? Ich habe nicht nachgeschaut, aber durchaus von SetWindowsHookEx als Methode für DLL Injections gelesen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr. |
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