Namen aller fenster die offen sind!



  • Ich möchte gerne von allen fenstern die offen sind den FensterTitel erhalten und in einen CString schreiben? Wie mache ich das am dümmsten?



  • Am besten machst du's sicher mit folgenden WinAPI-Funktionen:
    EnumWindows()
    IsVisible()
    GetWindowTextLength()
    GetWindowText()



  • Wie funktioniert EnumWindows?



  • Auszug aus MSDN:

    BOOL EnumWindows
    (
    WNDENUMPROC lpEnumFunc, // pointer to callback function
    LPARAM lParam // application-defined value
    );

    The EnumWindows function does not enumerate child windows.

    This function is more reliable than calling the GetWindow function in a loop. An application that calls GetWindow to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.



  • ich hab auch die msdn das hab ich schon gelesen aber was muss ich für Parameter einsetzen??



  • BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
       // Mach was mit dem Fenster hwnd
    }
    
    // Irgendwo im Code
    EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
    

    Ist das sooo schwer?



  • Wie bekomme ich jetzt aus hwnd den Namen des Fensters heraus und schreibe ihn in einen CString??????
    Und außerdem kommt folgender Error:
    d:\C-Programme\Winamp Controller\Winamp ControllerDlg.cpp(163): error C2440: 'Typenumwandlung' : 'overloaded-function' kann nicht in 'WNDENUMPROC' konvertiert werden
    😕 😕 😕

    [ Dieser Beitrag wurde am 09.09.2002 um 00:05 Uhr von Fink Christoph editiert. ]



  • Original erstellt von Fink Christoph:
    [QB]Wie bekomme ich jetzt aus hwnd den Namen des Fensters heraus und schreibe ihn in einen CString??????

    Wer lesen kann ist klar im Vorteil. 🙄
    Gell, WebFritzi?



  • @WebFritzi:

    folgender Fehler bei EnumWindows(...);

    type cast' : '' kann nicht in 'int (__stdcall *)(struct HWND__ *,long)' konvertiert werden
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

    was hat es damit aufsich??



  • Vielleicht nützt

    ::EnumWindows(...);
    

    etwas.



  • nein bringt garnichts!



  • @chris_g

    Poste doch mal etwas mehr Code von Deiner CallBack Funktion und deren Aufruf !!!

    BTW: Ist Deine Enum-Funktion Global ??? wenn nein dann ist das schon mal auf jeden Fall ein Fehler 😉

    MfG veganza



  • BOOL CALLBACK CGetwndowsDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    return TRUE;
    }
    
    void CGetwndowsDlg::OnButton1() 
    {
        ::EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);
    }
    

    wie definiere ich eine funktion global?



  • @chris_g

    Laß einfach das CGetwndowsDlg:: weg... so wäre es ja eine Funktion der Klasse 😉

    Ich würde es so versuchen : (Deine Proc Funktion ist ja etwas dürftig...)

    BOOL CALLBACK EnumWindowsProc(  HWND hwnd, LPARAM lParam )
    {
        char WindowText[255];
    
        if ( ::IsWindowVisible(hwnd) && ::IsWindow(hwnd) && ::GetParent(hwnd)==NULL )
        {
            ::GetWindowText( hwnd, WindowText, 255 );
            AfxMessageBox(WindowText); 
        }
    
        return TRUE;
    }
    
    void CGetwndowsDlg::OnButton1() 
    {
        EnumWindows( &EnumWindowsProc, NULL);   
    }
    

    Um jetzt das Fenster zu schließen mußt Du nur noch eine Suchfunktion anstelle der AfxMessageBox in der CALLBACK Funktion implementieren um in der WindowText Variable Deinen Suchbegriff zu finden. Wenn ein "Treffer" vorliegt mußt Du eigentlich nur noch ein WM_DESTROY o.ä. an das Fenster schicken... Handle zum Fenster ist ja auch vorhanden.

    MfG veganza

    [ Dieser Beitrag wurde am 12.09.2002 um 22:13 Uhr von veganza editiert. ]



  • schade aber es kommt schonwieder ein Fehler in dieser Zeile:

    EnumWindows(&EnumWindowsProc, NULL);

    ->error C2276: '&' : Ungueltige Operation auf Ausdruck einer gebundenen Member-Funktion

    was ist falsch?

    hab alles genu so reingepastet in den code wie es oben steht! 😕



  • IMHO: Schon mal daran gedacht Deine MemberFunktion EnumWindowsProc der CGetwndowsDlg-Klasse vorher zu löschen, bevor Du mir den Daumen nach unten zeigst 😡

    BTW: Wie lange programmierst Du eigentlich schon ???

    MfG veganza

    [ Dieser Beitrag wurde am 13.09.2002 um 17:24 Uhr von veganza editiert. ]



  • ich code etwa seit einem Jahr!

    so jetzt klappt die funktion super!!! Dankeschön!

    Wie kann ich jetzt auf eine variable meiner klasse zugreifen!

    so hab ich es versucht kommt aber ASSERT

    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
        CGetwndowsDlg m_dlg;//variable des dlgs
                    char WindowText[255];
    
        if ( ::IsWindowVisible(hwnd) && ::IsWindow(hwnd) && ::GetParent(hwnd)==NULL )
        {
            ::GetWindowText( hwnd, WindowText, 255 );
            m_dlg.m_lol = WindowText;//meine variable bekommt windowtext
            m_dlg.SetWnds();//funktion wird ausgeführt
        }
    
        return TRUE;
    }
    
    void CGetwndowsDlg::OnButton1() 
    {
    
     EnumWindows(&EnumWindowsProc, NULL);   
    
    }
    
    void CGetwndowsDlg::SetWnds()
    {
    m_ctlWnd.AddString(m_lol);//die funktion
    }
    


  • @chris_g

    Wie wäre es wenn Du den this Pointer Deiner Klasse beim EnumWindows Funktionsaufruf mit übergibst !!!

    Dann kannst Du in der EnumWindowsProc() Funktion auch auf Deine Dialog Funktionen/Variablen zugreifen !!! Mit Deinem Code legst Du ja nur eine neue Instanz des Dialoges an 😮 Dein Dialog läuft doch aber schon !!!

    MfG veganza

    P.S. Soll ich Dir Deine nächste Frage verraten 😉



  • Ok... wie übergebe ich den this zeiger?

    Ich wette du wusstest das diese frage kommt oder??? 🙄

    aber bitte helf mir noch bisschen



  • 😃 Mehr sage ich nicht...

    Aber eigentlich habe ich gehofft, daß nach meinem Tip die Frage vielleicht ausbleibt 🙄 denn die 2 Zeilen Source-Code die folgen sollten eigentlich nicht das Problem sein...

    Ich hole mal etwas aus, damit es für Dich verständlicher wird:

    In der MSDN ist zur EnumWindowsProc() Funktion folgendes über den 2. Parameter zu entnehmen.
    LPARAM lParam // application-defined value... soll heißen, da können Wir der funktion was mitgeben !!!

    Also tun wir das auch...

    EnumWindows( &EnumWindowsProc, (LPARAM)this );
    

    anstelle vom vorher verwendeten NULL im 2. Parameter.

    In der EnumWindowsProc() steht ja nun dieser this-Pointer zur Verfügung (Wir übergeben den ja schließlich mit). Um jetzt in der Funktion auf unsere Klasse zugreifen zu können fügen Wir den folgenden Code an den Anfang der EnumWindowsProc() Funktion.

    CGetwndowsDlg* pZumDialog = (CGetwndowsDlg*)lParam;
    

    und schon kannst Du in der CALLBACK Funktion über pZumDialog-> auf Deine Member Funktionen/Variablen zugreifen.

    Hoffe jetzt ist alles klar 😉

    MfG veganza

    [ Dieser Beitrag wurde am 14.09.2002 um 14:06 Uhr von veganza editiert. ]


Anmelden zum Antworten