AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi "Da ist ein Haken an meinem Haken" (warum spinnt mein Hook?)
Thema durchsuchen
Ansicht
Themen-Optionen

"Da ist ein Haken an meinem Haken" (warum spinnt mein Hook?)

Offene Frage von "LDericher"
Ein Thema von LDericher · begonnen am 3. Sep 2009 · letzter Beitrag vom 3. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

"Da ist ein Haken an meinem Haken" (warum spinnt m

  Alt 3. Sep 2009, 19:52
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)

Grüße vom LDer
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 3. Sep 2009, 19:55
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.
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 3. Sep 2009, 19:58
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 3. Sep 2009, 20:04
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 3. Sep 2009, 20:08
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
Aber was will ich damit? ich will keinen Firefox der mich sinnlos mit leeren ShowMessages zuspammt
Ich will, dass diese SendMessages gemacht werden... keine ShowMessages {wie oft will ich mich jetzt noch wiederholen? }

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?
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 3. Sep 2009, 20:42
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 3. Sep 2009, 20:59
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.
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
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 3. Sep 2009, 21:50
oder per IPC;
Das müsste aber alles im Tutorial drin' stehen

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

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

  Alt 3. Sep 2009, 22:58
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
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 3. Sep 2009, 23:06
Ist das wirklich nicht so? Ich habe nicht nachgeschaut, aber durchaus von SetWindowsHookEx als Methode für DLL Injections gelesen.
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
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 08:22 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