Programm ausführen nach beenden des Internet Explorers



  • Mit LoadLibrary kannst du die Dll laden, mit GetProcAddress die Adressen der exportierten Funktionen rausbekommen und mit FreeLibrary die Dll schließlich wieder freigeben. Ich poste auch gleich noch'n Beispiel-Code, muss ihn aber erst finden ;).

    cya 🙂

    EDIT:

    Die Hook-Dll dürft eigentlich die gleiche sein wie deine, also auch von toom.
    Hier der Code zum Laden:

    // ...
    
    typedef BOOL (* PINSTALLHOOK) (HWND);
    typedef BOOL (* PUNINSTALLHOOK) (void);
    
    // ...
    
    HINSTANCE       hDll;
    PINSTALLHOOK    pInstall;
    PUNINSTALLHOOK  pUninstall;
    
    // ...
    
    hDll = LoadLibrary(TEXT("Loggy_Dll.dll"));
    pInstall = (PINSTALLHOOK) GetProcAddress(hDll, "InstallHook");
    pUninstall = (PUNINSTALLHOOK) GetProcAddress(hDll, "UninstallHook");
    
    pInstall(hWnd);
    
    pUninstall();
    FreeLibrary(hDll);
    
    // ...
    

    So oder so ähnlich ;).

    [ Dieser Beitrag wurde am 11.03.2003 um 19:27 Uhr von MagiC Creator editiert. ]



  • Ja,
    das versteh ich.
    Da ich aber noch nicht genau weiß, wie ich dann z.B. Die Tastatureingabe auf dem Bildschirm ausgeben kann, wäre es schön, wenn du mir mal deinen kompletten Code mailen könntest.
    stark.sebastian@gmx.de



  • Hi,

    im Zweifelsfall kannst Du die DLL auch erst mal statisch zu Deiner Anwendung dazulinken. Das geht einfach indem Du die zu exportierenden Funktionen auf folgende Art und Weise in der DLL deklarierst:

    extern "C" __declspec(dllexport) HHOOK installHook();
    

    und in der Anwendung schreibst Du dann

    extern "C" __declspec(dllimport) HHOOK installHook();
    

    Dann fügst Du noch die beim Compilieren Deiner DLL entstandene LIB-Datei zu Deinem Anwendungs-Projekt hinzu, und fertig 🙂



  • Ja,

    aber mein derzeitiges Problem ist, dass ich einfach keine Ahnung habe, wie ich mit Hilfe von Tooms "Hookdll" zum Beispiel die Tastatureingaben in eine Datei speichern kann.
    Ich hab ja wie schon gesagt noch nix mit WinApi gemacht. Nur jetzt brauch ich halt sone "Hook"-Funktion dringend.
    Wär schön, wenn jemand mal den Code für ein Programm schickt, was Tooms "Hookdll" benutzt.

    Danke Nixwisser



  • Ich hab mir jetzt mal noch ein paar Beispiele angesehen.
    Dort hab ich gesehen, dass die Funktionen aus den Dlls irgendwie "geladen" werden. Ungefähr so:

    #define IMPORT extern "C" __declspec (dllimport)
    
    IMPORT BOOL CALLBACK SetupHook (HWND) ;
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    typedef BOOL (* PINSTALLHOOK) (HWND);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
    HINSTANCE       hDll;
    PINSTALLHOOK    SetupHook;
    
    //Dll laden (funktioniert noch)
    hDll = LoadLibrary(TEXT("hookdll.dll"));
    
    //Funktion SetupHook laden (gibt bei mir 0, wenn ich versuche das Beispiel aus der FAQ zu laden --> funktioniert nicht)
    SetupHook = (PINSTALLHOOK)GetProcAddress(hDll, "SetupHook");
    FreeLibrary(hDll);
    return 0;
    }
    

    Kompilieren geht ja, aber beim Ausführen stelle ich fest, dass die Funktion SetupHook nicht geladen werden kann (SetupHook ist dann 0).

    Kann mir da jemand weiterhelfen???
    Nixwisser



  • Mich würd' mal interessieren was das IMPORT-Zeug da sein soll... entferne mal die ersten beiden Zeilen, bei mir geht's nämlich ohne diese beiden ;).

    cya 🙂



  • Ja, du hast Recht, ausführen kann ichs jetzt schon. Meine Frage ist nur noch, wie ich dann innerhalb meines Proggis an die Tastatureingaben rankomm und sie dann z.B. in eine Datei speichere.

    Danke erstmal
    Nixwisser



  • Der Hook aus der FAQ schickt WM_USER + 2 ans Programm. Die Message verarbeitest du einfach, im WPARAM steht die gedrückte Taste.

    cya 🙂



  • THX,

    wenn du mir das sagst, erscheints mir logisch.
    Nur ist das ganze ja sozusagen "systemweit". Man müsste es ja noch irgendwie auf die eigentliche Fragestellung übertragen können. Denn irgendwie muss es ja gehen, dass ganze auch mit dem "Schließen-Signal" des Internet Explorers funzt.
    Aber, wenn ich dass in der MSDN richtig verstanden habe, brauch ich da ja sone Art ID von dem Prog, mit der ich dann wirklich nur dieses Programm "hooken" kann. Weißt du, wie das genau funktioniert und wie ich dass dann mit dem Internet Explorer verwenden kann??

    Nixwisser



  • Sag mal,womit hast du eigentlich die Sockets programmiert?Ich hab den Eindruck du solltest dich mal mit der Materie beschäftigen.
    Entweder willst du programmieren(dann aber auch vernünftig) oder du lädst dir irgendwo nen Programm runter dass das kann was du möchtest.
    Frag doch mal MagicCreator ob er dir gegen Bezahlung dein Prog schreibt,was anderes macht er zur Zeit ja auch nicht.
    :p

    MfG Spacelord 🙂



  • du brauchst kein keyboardhook sondern ein messagehook: WH_CALLWNDPROC...



  • @Spacelord:
    Winapi an zwei Tagen oder was (ich brauchs möglichst schnell)???

    Was Sockets angeht: Das is ja wirklich total billig. Ich programmier ja auch schon länger, nur halt Konsole (und unter Linux). Nu brauch ich aber mal ein Prog für Windows. Und wenn du mir ein Programm zum Runterladen nennen könntest, was mir hilft, wär mir schon sehr geholfen ...

    @<toom>&&MagiCcreator
    Danke erstmal für eure schnelle Hilfe.
    Ich hoff mal, dass ichs jetzt hinkriege

    Nixwisser



  • hier eine loesung fuer dein problem:

    in dem beispiel aus der FAQ die beiden funkitonen vertauschen:

    EXPORT BOOL CALLBACK SetupHook (HWND hParent){
        hWindow = hParent ;
        hhkHook = SetWindowsHookEx (WH_CALLWNDPROC, KeyboardHookProc, hDllInstance, NULL) ;
        return TRUE ;
    }
    
    LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){
        HWND hIE ;
        hIE = FindWindow ("IEFrame", NULL) ;
        if((((CWPSTRUCT*)lParam)->hwnd == hIE) && (((CWPSTRUCT*)lParam)->message == WM_DESTROY)){
            SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, NULL) ;
        }
        return CallNextHookEx (hhkHook, nCode, wParam, lParam) ;
    }
    

    wenn du jetzt den IE schliesst sendet die dll eine nachricht an dein prog...

    ich hoffe ich habe dir geholfen...



  • Danke,

    ich werds mal ausprobieren.
    Aber auf den ersten Blick, isses genau das was ich suche (inzwischen hab ich die Sache mit den Hooks denk ich auch halbwegs verstanden - dank eurer "geduldigen" Hilfe *g*).

    Nixwisser



  • @Spacelord: Was mach ich ;)?

    cya 🙂



  • Wir wolln uns jetzt ja net streiten oder???

    Auf jedenfall gehts jetzt genau so, wie ich mir das vorgestellt hab.

    Nochmal Danke an alle
    Nixwisser



  • Wir würden doch _nie_ streiten :D.
    Aber freut mich, dass es jetzt funktioniert.

    cya 🙂



  • du kannst noch einen zaehler einbauen... (wenn es mehrere instanzen von dem IE geben sollte) z.b.

    #pragma data_seg ("Shared")
    HWND hWindow = 0 ;
    int iZaehler = 0 ;
    #pragma data_seg ()
    
    LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){
        HWND hIE ;
        if (nCode == HC_ACTION){
            hIE = FindWindow ("IEFrame", NULL) ;
            if((((CWPSTRUCT*)lParam)->hwnd == hIE) && (((CWPSTRUCT*)lParam)->message == WM_CREATE)){
                iZaehler++ ;
            }
            if((((CWPSTRUCT*)lParam)->hwnd == hIE) && (((CWPSTRUCT*)lParam)->message == WM_DESTROY)){
                if (iZaehler == 1){
                    SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, (LPARAM) lParam) ;
                    iZaehler = 0 ;
                }
                else{
                    iZaehler-- ;
                }
            }
        }
        return CallNextHookEx (hhkHook, nCode, wParam, lParam) ;
    }
    

    mfg
    toom



  • Ja, die Idee hatte ich auch schon.
    Aber wenn ich dass ganze in der DLL habe, wird der Zähler bei jedem Aufruf der "KeyboardHookProc"-Funktion wieder auf 0 zurückgesetzt.

    Gibts da ne andre Lösung oder mach ich was falsch???

    Nixwisser



  • Also ich habs jetzt nochmal probiert.
    Das verhält sich so:
    Wenn man durch Datei->Neu->Fenster oder durch nen Link ein neues IE-Fenster aufmacht geht deine Methode, aber wenn man den Internet Explorer einfach nochmal startet(indem man die IEXPLORE.EXE nimmt), setzts den Zaehler komischerweise zurück. Ich habs jetzt erstmal mit ner temporären Datei gelöst, die speichert, wieviele Instanzen laufen, aber ideal is das ja nu wirklich net.

    Achso und nochne Frage: Wie bekommt man denn den Fenstername für ein beliebiges Programm raus (z.B. IEFrame)???

    Danke Nixwisser


Anmelden zum Antworten