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 typeWas 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