Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi "Da ist ein Haken an meinem Haken" (warum spinnt mein Hook?) (https://www.delphipraxis.net/139714-da-ist-ein-haken-meinem-haken-warum-spinnt-mein-hook.html)

LDericher 3. Sep 2009 18:52


"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:
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.
Und meine Routine im Hauptformular:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
ListBox1.Items.Add(inttostr(Key));
Caption:=inttostr(Key);
end;
Dann erstmal folgendes vorweg: Überraschenderweise hat alles so weit funktioniert, nachdem ich mir das so weit zurechtgeschnippselt hatte.
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

Apollonius 3. Sep 2009 18:55

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.

himitsu 3. Sep 2009 18:58

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)

Aphton 3. Sep 2009 19:04

Re: "Da ist ein Haken an meinem Haken" (warum spin
 
Zitat:

Zitat von himitsu
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)

Nö, bei der Frage hast du ein Denkfehler:
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

LDericher 3. Sep 2009 19:08

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?

himitsu 3. Sep 2009 19:42

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.

Apollonius 3. Sep 2009 19:59

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.

Aphton 3. Sep 2009 20:50

Re: "Da ist ein Haken an meinem Haken" (warum spin
 
oder per IPC;
Das müsste aber alles im Tutorial drin' stehen

MfG

Zacherl 3. Sep 2009 21:58

Re: "Da ist ein Haken an meinem Haken" (warum spin
 
Zitat:

Zitat von Aphton
SetWindowHookEx() setzt einen globalen Hook, wenn der letzte Parameter = 0 ist;
Bei einem globalen Hook wird die dll automatisch in alle Processe "attached"

Interessehalber: Wird die DLL wirklich in den Adressraum eines jeden Prozesses geladen? Dementsprechend könnte ich in der DllMain bei DLL_PROCESS_ATTACH für jeden Prozess differenzierte Operationen durchführen?

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 :)

Apollonius 3. Sep 2009 22:06

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 09:47 Uhr.
Seite 1 von 2  1 2      

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