Key-Hooks auf biegen und brechen.



  • Hallo,

    nachdem ich gerade eine Stunde die Suchfunktion einem Dauertest unterzogen habe ist
    mir vorallem aufgefallen das es neben dem Senden von Dateien über Sockets wohl
    das Lieblings-Problem-Thema zu sein scheint.

    Viele Themen versprachen große Hoffnungen... und es ging wieder nicht.. 😞

    Also mal zu meinem Problem...

    Ich habe Die DLL 'erzeugt' und dabei vorher über
    Projekt->Optionen->C++ Compiler->Build Konfiguration = Release
    eingestellt. Die DLL kompiliert ohne gezehter.
    (Die DLL heißt keydll.dll)

    Die DLL zudem zur Sicherheit in den Projekt sowie in den .\Debug\ Ordner kopiert.

    Die Formularanwendung ebenfalls ohne Probleme erzeugt.

    Ich habe den Original QuellCode aus der FAQ genutzt.
    Die keydll.lib ist ebenfalls eingebunden.
    Das Formular heißt auch KeyHookForm (oder auch TKeyHookForm).

    Nachdem ich die Formularanwendung kompiliert habe schläft es ruhig wie eine Katze auf Opium. Macht also nichts. Die ListBox bleibt leer...

    Es scheint wir fast wie verhext. Auch die Suche im Forum ergab nur das es zu meißt daran liegt das die Form die falsche Caption/Namen trägt da ja die Meldung via HWND ghAppWnd = FindWindow("TKeyHookForm", 0); gesendet wird.
    Aber bei mir allem anschein nach nicht...

    Da ich nun am Ende meines Latein-Büchleins bin... Muss ich wohl Threah 102 zum Thema MEIN HOOK GEHT NICHT erstellen. Ich weiß einfach nicht woran es liegen kann.



  • Kleiner Nachtrag:

    Habe mal zum testen versucht in die DLL

    exit(0);

    oder auch

    ShowMessage("Kannst Du mich sehen?");

    versucht einzufügen. Beides erzielt keine Wirkung.
    Noch zur Info... verwende den BCB 11 unter Windows Vista
    (Als Admin ausführen erzielt ebenfalls keine Veränderung)



  • Lies mal hier nach, was Microsoft zu den Veränderungen bei PostMessage/SendMessage in Windows NT 6 aka Vista/Server 2008 schreibt:

    MSDN: SendMessage Function schrieb:

    Remarks

    Microsoft Windows Vista and later. When a message is blocked by UIPI the last error, retrieved with GetLastError, is set to 5 (access denied).

    Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication.

    The system only does marshalling for system messages (those in the range 0 to (WM_USER-1)). To send other messages (those >= WM_USER) to another process, you must do custom marshalling.

    If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message. However, the sending thread will process incoming nonqueued messages while waiting for its message to be processed. To prevent this, use SendMessageTimeout with SMTO_BLOCK set. For more information on nonqueued messages, see Nonqueued Messages.

    Kommunizieren mittels Messages ist demnach in Windows Vista stark eingeschränkt. Du könntest eine andere IPC-Methode suchen oder das hier lesen.

    Außerdem ist im FAQ-Eintrag ein Fehler, auf den ich hier schon einmal hingewiesen habe. Das könnte in den FAQ mal geändert werden.



  • Hmm ok danke ersteinmal für den Link.

    Allerdings scheint mir das Problem zu sein das ich soweit im Code
    gar nicht erst komme. Wie oben geschrieben hab ich mal ein exit(0);
    In die Methode geschrieben aber auch nach einem Tastendruck lief mein
    Programm weiter. Ich habe mir so sozusagen versucht eine Marke im Debuger
    zu setzten um zu ermitteln ob die Methode überhaupt aufgerufen wird.

    Ich weiß natürlich gerade nicht ob ein exit(0); in einer DLL so im Sinne
    des erfinders funktioniert... wenn ja wird die Methode definitiv nicht aufgerufen.



  • Sollte mich endlich mal registrieren^^

    Wenn ich wenigsten die DLL im Debuger nutzen könnte... 😞

    Gruß
    Jens



  • Slashi schrieb:

    Allerdings scheint mir das Problem zu sein das ich soweit im Code
    gar nicht erst komme. Wie oben geschrieben hab ich mal ein exit(0);
    In die Methode geschrieben

    In welche Methode?



  • Aus der DLL:

    DWORD __stdcall CheckKey(int nCode, WORD wParam, LONG lParam)
    {
      HWND ghAppWnd = FindWindow("TKeyHookForm", 0);
      if((nCode < 0) || nCode == HC_NOREMOVE)
        return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
    
      // Skip if it's a repeat
      if(lParam & 0x40000000)
        return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
    
      // Send key information to the main window
      exit(0);
      SendMessage(ghAppWnd, WM_KEYHOOK, 0, lParam);
    
      return CallNextHookEx(ghhookKB, nCode, wParam, lParam);
    }
    


  • audacia schrieb:

    Außerdem ist im FAQ-Eintrag ein Fehler, auf den ich hier schon einmal hingewiesen habe. Das könnte in den FAQ mal geändert werden.

    Sobald jemand korrigierten Code postet ... 😉



  • Wenn das Kind hier zur Welt gekommen ist können wir es ja dazu
    aufbereiten. Dann ist es direkt TOP Aktuell für Vista und den Borland C/C++ Builder 11.0 🙂

    Immerhin scheint es ja oft Probleme zu bereiten...



  • Jansen schrieb:

    Sobald jemand korrigierten Code postet ... 😉

    Werde ich beizeiten mal tun.

    @Slashi: ist denn CreateWindowsHookEx() erfolgreich, wenn nicht, was gibt GetLastError() zurück?



  • Werde ich Heute Abend mal schauen...



  • GRRR!!!

    Ok das Problem war (wie ich fast dachte) zu einfach...
    Die onCreate() wird beim kopieren nicht richtig implementiert.
    D.h. ohne das SetHook(); aufgerufen wird kann ja auch nicht viel
    passieren 😉

    Danke trotzdem für die Hilfe!



  • Kann man eigentlich auch unterscheiden zwischen Key-Press und Key-Unpress?
    Gerde bei der Schifttaste wäre das doch recht hilfreich.


Anmelden zum Antworten