Programm ausführen nach beenden des Internet Explorers



  • @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



  • mit GetWindowText() bekommst du den namen...
    und was die dll angeht gucke ich mir morgen an.



  • hi, ich habe die loesung...
    die funktionen in der dll mussen folgend aussehen:

    #pragma data_seg ("Shared")
    HWND hWindow = 0 ;
    int iZaehler = 0 ;
    #pragma data_seg ()
    
    #pragma comment (linker, "/section:Shared,RWS")
    
    LRESULT CALLBACK KeyboardHookProc (int, WPARAM, LPARAM) ;
    
    HHOOK       hhkHook ;
    HINSTANCE   hDllInstance ;
    
    int APIENTRY DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
        switch (fdwReason){
            case DLL_PROCESS_ATTACH :
                hDllInstance = hInstance ;
                break ;
        }   
        return TRUE ;
    }
    
    EXPORT BOOL CALLBACK SetupHook (HWND hParent){
        hWindow = hParent ;
        hhkHook = SetWindowsHookEx (WH_CBT, KeyboardHookProc, hDllInstance, NULL) ;
        return TRUE ;
    }
    
    LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){
        TCHAR   szClassName[_MAX_PATH] ;
        if (nCode == HCBT_CREATEWND){
            szClassName[0] = '\0' ;
            GetClassName ((HWND) wParam, szClassName, sizeof (szClassName)) ;
            if (strcmp (szClassName, "IEFrame") == 0){
                InterlockedIncrement ((LPLONG) &iZaehler) ;
            }
        }
        else if (nCode == HCBT_DESTROYWND){
            szClassName[0] = '\0' ;
            GetClassName ((HWND) wParam, szClassName, sizeof (szClassName)) ;
            if (strcmp (szClassName, "IEFrame") == 0){
                InterlockedDecrement ((LPLONG) &iZaehler) ;
                if (iZaehler == 0){
                    SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, (LPARAM) lParam) ;
                }           
            }
        }
        return CallNextHookEx (hhkHook, nCode, wParam, lParam) ;
    }
    
    EXPORT BOOL CALLBACK UninstallHook (void){
        UnhookWindowsHookEx (hhkHook) ;
        return TRUE ;
    }
    

    funzt super...
    voraussetzung ist das dein prog gestartet wird vor dem IE
    was noch optimmiert sein koennte ist der stringvergleich "strcmp", aber das ueberlasse ich dir...

    mfg
    toom



  • Die Fenster-Klassen-Namen von anderen Programmen kannst du z.B. mit Spy++ (bei VS dabei) auslesen 🙂



  • Danke,

    dass funktioniert jetzt erstmal alles soweit. Ohne eure Hilfe hätt ich dass wohl kaum hingekriegt(jedenfalls nicht, ohne mich vorher noch nen Monat mit WinApi zu beschäftigen ;))
    Und das mit dem Fensterklassenauslesen hab ich auch so hingekriegt. Da gabs schon mal nen Beitrag, wos darum ging. Man muss halt nur ausprobieren, welches dann die richtige ist (bei Outlook Express habe ich z.B. zehn verschiedene ausgelesen und dann probiert ;)).

    Nixwisser


Anmelden zum Antworten