Fenstertitle aller existierenden Fenster in eine Liste ausgeben...



  • Hallo,

    ich möchte gern alle Fenster die bei mir auf'm Desktop existieren in eine Liste ausgeben, aber von jeden Fenster nur den
    Fenstertitle. Ich habe angefangen mit FindWindow und dann mit GetNextWindow alle Fenster durchzugehen.
    Doch leider bleibt die Messagebox immer leer, und er gibt unzählig viele Messageboxen aus...

    Hier mein Code

    CWnd* pWndFound;
    	CWnd* pWnd = FindWindow("Shell_TrayWnd", NULL);
    
    	if(pWnd)
    	{
    		pWndFound = pWnd->GetNextWindow(GW_HWNDNEXT); 
    
    		while(pWndFound)
    		{
    			CString str;
    			pWndFound->GetWindowText(str);
    
    			pList->InsertItem(0, str);
    		}
    	}
    

    Danke für jede Hilfe
    LayLow



  • Hi,

    also irgendwie macht das auf mich den Eindruck, dass Du da was übersehen hast: Hast Du Dir mal die Abbruchbedingung für Deine while-Schleife angesehen? Wenn Du schreibst:

    while(pWndFound)
    

    und pWndFound wird in der Schleife nie verändert (zumindest kann ich nichts davon entdecken), dann hast Du einen echten Klassiker: Eine Endlosschleife. Vielleicht solltest Du mal die Zeile

    pWndFound = pWnd->GetNextWindow(GW_HWNDNEXT);
    

    in die while-Schleife reinnehmen....

    Gruss

    yeti

    PS: Und von einer Messagebox konnte ich auch nichts sehen...



  • Sorry, die MessageBox sollte in der Zeile stehen wo das InsertItem aufgreufen wird...

    Also die Endlos-Schleife ist immernoch vorhanden, auch wenn ich es so schreibe:

    while(pWndFound = pWnd->GetNextWindow(GW_HWNDNEXT))
    

    Danke
    LayLow



  • Schau dir mal in der MSDN die Funktion EnumWindows und die CALLBACK-Funktion EnumWindowProc an...



  • Okay, hab mir da Code besorgt. Doch es entsteht immer ein Compiler-Fehler, den ich nicht verstehe...

    Code:

    BOOL CALLBACK CProgDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam) 
    { 
    	CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST1);
        TCHAR szBuffer[256]; 
        memset(szBuffer,0,sizeof(szBuffer)); 
    
        ::GetWindowText(hwnd, szBuffer, sizeof(szBuffer)); 
    
    	pList->InsertItem(0, szBuffer);    
    
        return TRUE; 
    }
    

    Aufruf:

    EnumWindows(EnumWindowsProc, (LPARAM)this);
    

    Fehler:

    error C2664: 'EnumWindows' : cannot convert parameter 1 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)'
    None of the functions with this name in scope match the target type

    Was soll ich sonst statt "EnumWindowsProc" eingeben ? Oder anders schreiben?

    Thanks - LayLow



  • Du sollst die "EnumWindowsProc" nicht als Funktion der Klasse CDialog, sondern eine als globale Funktion deklarieren.

    //...
    BOOL CALLBACK EnumWindowsProc(      
        HWND hwnd,
        LPARAM lParam
    )
    {
    	TRACE("Window: %d\n",hwnd);
    	return TRUE;
    }
    void CEnumAllWindowsDlg::OnButton1() 
    {
    	EnumWindows(EnumWindowsProc,0);
    }
    //...
    

    ⚠
    Dann habe ich auch eine Frage: Wie kann man nur die aktive Fenster bzw. Programme anzeigen lassen, halt so wie im Task-Manager?



  • Hmm, aber der Fehler bleibt ... ?
    Woran liegt das...

    Gleicher Fehler:

    'EnumWindows' : cannot convert parameter 1 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)'
            None of the functions with this name in scope match the target type
    

    Danke - LayLow



  • Okay, Fehler gelöst. Hatte in der Header noch die Funktion angelegt, deswegen... 😃

    Doch jetzt hätte ich die gleiche Frage wie Cplusplus ...
    Wie kann man nur aktive Fenster ausgeben?

    Danke - LayLow


Anmelden zum Antworten