Announcement

Collapse
No announcement yet.

Hooks

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hooks

    <b>Ich weis es ist ein heikles Thema</B>
    <br>
    <br>
    Hallo erstmal,<br>
    <br>
    ich interessiere mich sehr für Hooks!! Ich habe auch schon das SDK durchgelesen!! Also im prinzip weis ich wie das mit den Hooks funktioniert und aufgebaut ist. Allerdings fehlt mir der Sprung zu Delphi!!<br>
    Sprich ich fände es super wenn jemand (auch wenns nur Code Fetzen sind) hier mal ein bisschen Beispiel code posted damit ich mir ein kleines Bild machen kann!!<br>
    <br>
    Vielen dank im vorraus!!<br>
    <br>
    mfg<br>
    <br>
    Daniel

  • #2
    Hallo,

    angenommen, man möchte einen Tastatus-Hook schreiben, der alle Tastatureingaben von beliebigen anderen Anwendungen überwacht. Dazu sind die folgenden Schritte notwendig:

    1. Die <b>Hook-DLL</b> exportiert eine Hook-Prozedur, die den von Win32 je nach Hook-Typ erwarteten Aufbau hat. Die "<i>KeyboardProc hook procedure</i>" wird später über den Aufruf <i>SetWindowsHookEx(WH_KEYBOARD, ProcAddr, DLL, 0)</i> aktiviert. Somit legt SetWindowsHookEx die erwartete Implementierung dieser Hook-Funktion fest. Windows ruft die eigene Hook-Funktion immer dann auf, wenn irgend eine Anwendung die Win32-API-Funktion <i>GetMessage</i> oder <i>PeekMessage</i> aufruft und dabei die Windows-Botschaften WM_KEYUP oder WM_KEYDOWN bearbeitet werden:

    <pre>
    function KeyboardProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): Longint; <b>stdcall</b>;
    begin
    // Implementierung
    end;

    exports
    KeyboardProc index 1;
    </pre>

    2. Ein <b>Hook-Host</b> (EXE) sorgt dafür, dass die Hook-DLL "scharfgemacht" wird bzw. bei Beendigung der Host-Anwendung wieder deaktiviert wird:
    <pre>
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ...
    // Hook-DLL mit der Hook-Funktion scharfmachen
    sDLLPath := sAppPath + 'keyhook.dll';
    hDLL := LoadLibrary(PChar(sDLLPath));
    pDLLProc := GetProcAddress(hDLL, PChar('KeyboardProc'));
    hHook := SetWindowsHookEx(WH_KEYBOARD, pDLLProc, hDLL, 0);
    if hHook = 0 then
    RaiseLastWin32Error;
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    // am Ende wieder aufräumen
    UnhookWindowsHookEx(hHook);
    end;
    </pre>
    3. Um den Rest kümmert sich Win32

    Comment


    • #3
      Hallo Herr Kosch!!<BR>
      <BR>
      Vielen dank für die Hilfe!! Das hilft mir schon viel weiter!!<BR>
      <BR>
      mfg<BR><BR>
      Danie

      Comment


      • #4
        Nur als Warnung globale Hooks in Delphi sind nicht immer stabil zu kriegen. Ich habe meinen Shell-hook in C geschrieben, da die Delphi-Variante nicht so stabil zu kriegen war wie die C-Variante.
        Es koennte ein Problem mit dem Initialisierungscode von Delphi sein

        Comment


        • #5
          Hallo Robert,

          Das Problem kenne ich auch ;o). Delphi 3 lief problemlos, Delphi 4.00-4.01 machte mir Sorgen, und bei Delphi 4.02-5.01 gings wieder. Und das alles bei dem gleichen Quellcode, der nur Windows und Messages im Uses hatte mit reinen API aufrufen.

          Gruß Nic

          Comment


          • #6
            Uhhhhh<BR>
            Also ihr meint wenn ich einen Shell Hook in Delphi schreib läuft der nicht so stabil??? <br>
            Was ist denn wenn ich den Hook selber in C schreibe?? Kann ich den dann ohne stabilitäts probleme in Delphi einbauen?? <br>
            <br>
            mfg<br>
            <br>
            Danie

            Comment


            • #7
              Hallo,

              haben die problematischen Delphi-Hooks die Unit <i>SysUtils</i> verwendet? ;-

              Comment


              • #8
                Ja - aber nicht lange ;o)
                (SysUtils)

                Gruß Nic

                Comment

                Working...
                X