Wieder mal Keyboard-Hooks



  • Eventuell mit dem Debugger den Programmverlauf verfolgen.

    Chris_ schrieb:

    habs jetzt schon soweit, dass es sich kompilieren lässt...

    Wo war denn der Fehler ( die anderen wollens vielleicht wissen ).



  • ehrlich gesagt:
    keine ahnung wo der Fehler lag, ich hab alles nochmal genauso gemacht...
    dann gings, bis auf die tatsache, dass die listbox nichts anzeigt 😞

    Weißt, du wo der Fehler evtl. sein könnte??
    Ich probiers jetzt mal mit dem Debugger

    Chris_



  • das programm läuft ohne mir im debugger ersichtlichen Fehler...

    nur dass es eben keine keys ausgibt 😞 😕

    Hat jemand noch ne Idee?

    Chris_



  • Der Code aus der FAQ ist fehlerlos (natürlich 😃 ).

    Nun kannst du versuchen herauszubekommen, ob die dll aufgerufen wird.

    Setze mal die ShowMessage in SetHook der DLL:

    void __stdcall SetHook(void)
    {
      HOOKPROC lpfnHookProc = NULL;
      lpfnHookProc = GetProcAddress(GetModuleHandle("keydll.dll"),"CheckKey");
      ghhookKB = SetWindowsHookEx(WH_KEYBOARD, lpfnHookProc, ghInst, NULL);
    
      //----------- TEST -----------
      ShowMessage("ProcAddress: " + IntToStr(int(lpfnHookProc)));
    }
    //---------------------------------------------------------------------------
    

    Was wird ausgegeben ?



  • Jetzt geht nichtmal mehr das Programm:

    Wenn ich es starten will, kommt die Meldung, dass Project1.dll nicht gefunden wurde, obwohl ich keydll.dll hinzugefügt habe..
    bin gerade echt am verzweifeln 😕

    Chris_

    Edit: Wenn ich die DLL kopiere und sie als Project1.dll wieder einfüge, startet zwar das Programm, aber die listbox macht natürlich wieder gar nichts

    Edit: Jetzt hab ich deine Frage ganz vergessen:
    Ausgegeben wird gar nichts, d. h. das programm wird gestartet, man sieht die Form mit der ListBox, aber sonst tut sich nichts...



  • Wie hast du die keydll zum Projekt hinzugefügt?

    In deiner Projektdatei müsste stehen

    USELIB("keydll.lib");
    


  • -beide(dll&lib) liegen im gleichen verzeichnis wie das projekt
    -beide habe ich per Projekt -> Dem Projekt hinzufügen einbezogen
    ist das falsch?
    wenn ja, wie muss ich es sonst machen?

    Chris_



  • Dem (Formular-)Projekt fügst du nur die keydll.lib hinzu. Keine keydll.cpp.



  • Was muss ich jetzt wo genau hinzufügen?



  • Nicht, dass wir aneinander vorbeireden.
    Unter Projekt/Dem Projekt hinzufügen wird die keydll.lib hinzugefügt. Möglicherweise hast du das gemacht,
    deshalb schrieb ich weiter oben, was im Projekt-Quelltext stehen sollte.

    Wenns immer noch nicht funktioniert, poste mal diesen Code (Ansicht/Projekt-Quelltext).

    mfg
    kpeter



  • Projekt-Code:

    #include <vcl.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    USEFORM("Unit1.cpp", Form1);
    USELIB("keydll.lib"); //<- Hab ich jetzt per Hand eingefügt, obwohl ich die
                          //   Lib-Datei dem Projekt hinzugefügt habe(Projekt->dem..
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     Application->CreateForm(__classid(TForm1), &Form1);
                     Application->Run();
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            catch (...)
            {
                     try
                     {
                             throw Exception("");
                     }
                     catch (Exception &exception)
                     {
                             Application->ShowException(&exception);
                     }
            }
            return 0;
    }
    


  • Chris_ schrieb:

    Projekt-Code: (Auszug, edit kpeter)

    USELIB("keydll.lib"); //<- Hab ich jetzt per Hand eingefügt, obwohl ich die
                          //   Lib-Datei dem Projekt hinzugefügt habe(Projekt->dem..
    //---------------------------------------------------------------------------
    

    Diesen Eintrag sollte die IDE selbst vornehmen, wenn man zum Projekt die Lib hinzufügt.

    Aber noch mal zu deinem Eingangspost. Wie ist das zu verstehen:

    Chris_ schrieb:

    ich habe die drei quellcodes aus der FAQ zum thema kopiert und die dll "keydll.dll" und "keydll.lib" endgültig erstellt...

    Hast du das jeweils komplett in einem Stück in die Dateien kopiert?
    Dann wäre die erste Fehlermeldung zu verstehen, denn das Original-Form aus der FAQ nennt sich TKeyHookForm und nicht TForm1.

    Dann wette ich beinahe 1000:1, dass im Objektinspektor die Ereignisse deines Formulares leer sind. 😞



  • kpeter schrieb:

    Diesen Eintrag sollte die IDE selbst vornehmen, wenn man zum Projekt die Lib hinzufügt.

    Ich weiß, dass sie das tun sollte, tut sie aber nicht...

    Mit dem "kopiert" meinte ich natürlich nicht den kompletten quellcode kopiert und den ausgangsquellcode komplett überschrieben...

    Auch die Ereignise im Objektinspekter meiner Form sind natürlich nicht leer

    Chris_

    Edit: Habs nochmal komplett neu gemacht: Jetzt kommt beim starten des Programmes die Meldung "ProcAddress:0",(um auf deine vorherige Frage zurückzukommen), aber ein Tastendruck wird immer noch nicht aufgenommen 😞



  • Sorry, wäre auch zu arg gewesen 😉



  • ja schon...
    Sonst noch ne Idee???



  • Noch ein möglicher Test (selbe Stelle wie zuvor)

    //----------- TEST -----------
       HMODULE kdll = GetModuleHandle("keydll.dll");
       ShowMessage("ModuleHandle: " + IntToStr(int(kdll)));
    

    Wert grösser Null muss angezeigt werden, wenn DLL gefunden.

    Edit: ProcAddress muss auch grösser Null sein.



  • ProcAddress: 137720
    ModuleHandle: 131072

    Von Tastendruck immer noch keine Spur...

    Chris_



  • Schon mal gut 🙂 Woran hats denn gelegen bisher?

    Eigentlich sollte nun die Hook-Message verarbeitet werden (egal, in welches Programm/Editor du gerade etwas reintippst).

    Prüfe mal die Werte in der Funktion CheckKey...



  • kpeter schrieb:

    Woran hats denn gelegen bisher?

    Eigenleben des BCB... 😃

    kpeter schrieb:

    Prüfe mal die Werte in der Funktion CheckKey...

    wie kann ich das machen? auch über den debugger?

    Chris_



  • Habe das FAQ-Beispiel gerade mal im BCB2009 auf WinXP nachgebaut, funktioniert auf Anhieb.
    Der FAQ-Eintrag stammt aus BCB5-Zeiten, an der BCB-Version liegt es also nicht.


Anmelden zum Antworten