Window Title in ListBox anzeigen



  • Hallo, ich möchte von allen auf dem Computer ausgeführten Programmen die Fenster Titel in einer List Box anzeigen. Das Problem ist, das in der Listbox nur der Fenstertitel meines Programms angezeigt wird, also TaskView1. Wenn ich aber die Variable pcWinTitle(die die Fensternamen enthält) mit einer MessageBox ausgebe, zeigt er mir alle Fensternamen an, so wie es sein soll.
    Hier ist schonmal mein Code:

    #include <windows.h>
    #include "taskviewer.h"
    #include "resource.h"
    HWND hDialog;
    BOOL CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM   lParam);
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR  lpCmdLine, int nCmdShow)
    {
    	MSG msg;
    	hDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, DialogProc);
    	ShowWindow(hDialog, nCmdShow);
    	UpdateWindow(hDialog);
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    
    				TranslateMessage(&msg);
    				DispatchMessage(&msg);		
    
    	}
    	return msg.wParam;
    }
    
    	BOOL CALLBACK EnumWindowProc(HWND hwnd,LPARAM lParam)
    	{
    		char pcWinTitle[256];
    		if(!GetWindow(hwnd, GW_OWNER))
    		{
    			GetWindowText(hwnd, pcWinTitle, 255);
    			AddTasks(hwnd, pcWinTitle); // Hier zeigt er nur TaksView1 an.
                MessageBox(NULL, pcWinTitle, "Test", MB_OK); // Hier zeigt er alle Titel an.
    		}
    		return true;
    	}
    
    BOOL CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
    
    	case WM_INITDIALOG:
    		{
    			EnumWindows((WNDENUMPROC)EnumWindowProc, 0);
    			return 0;
    		}
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case IDOK:
            case IDCANCEL:
                DestroyWindow (hwndDlg);
                return (TRUE);
    
            default:
                break;
            }
            return (FALSE);
    
        case WM_CLOSE:
    		PostQuitMessage(0);
        case WM_DESTROY:
            EndDialog (hwndDlg, 0);
            return (TRUE);
        }
        return (FALSE);
    }
    
    BOOL AddTasks(HWND hwndDlg, char pcWinTitle[256])
    {	
    	int index = SendDlgItemMessage(hwndDlg, IDC_TASKLIST, LB_ADDSTRING, 0, (LPARAM)pcWinTitle); // Fügt Tasks in die ListBox
    	return TRUE;
    }
    

    Wisst ihr woran das Problem liegt? Ich benutze zum ersten mal eine Listbox mit der WinAPI.

    MFG MrBigBrain



    Deine WinMain ist flasch und sollte so aussehen:

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char* pszCmdLine, int iCmdShow)
    {
        return (DialogBox(hInst, MAKEINTRESOURCE(DLG_RESOURCE_ID), NULL, DlgProc));
    }
    

    (Das wird aber noch nicht dein Problem lösen 😉 . Siehe dazu 2.)

    GetWindowText kann den Titel von Fenstern nicht prozessübergreifend ermitteln.
    Du kannst altenativ SendMessage und WM_GETTEXT bzw. WM_GETTEXTLENGTH (für
    dynamische Allokation) verwenden 😉 .



  • Hallo, ich verstehe nicht was du meinst, ich habe jetzt 100 Möglichkeiten ausprobiert, aber ich bekomme nur TaskViewer1, oder 100 mal TaskViewer1 in der List Box zu gesicht.



  • Mir fällt auch grad auf das du immer der Funktion AddTasks einen falschen Handle übergibst, guck dir mal deine
    EnumWindowProc nochmal an.

    PS: WAS verstehst du denn nicht ?



  • Ich verstehe nicht warum es immer noch nicht funktioniert. Das ist meine EnumWindowProc:

    BOOL CALLBACK EnumWindowProc(HWND hwnd,LPARAM lParam)
    {
    	char pcWinTitle[256];
    	if(!GetWindow(hwnd, GW_OWNER))
    	{
    		//GetWindowText(hwnd, pcWinTitle, 255);
    		//AddTasks(hwnd, pcWinTitle); // Hier zeigt er nur TaksView1 an.
    		SendMessage(hwnd, WM_GETTEXT, (WPARAM)sizeof(pcWinTitle), (LPARAM)pcWinTitle);
    		//MessageBox(hwnd, pcWinTitle, "Test", MB_OK); // Hier zeigt er alle Titel an.
    		AddTasks(hwnd, pcWinTitle);
    		//AddTasks(hwnd, pcWinTitle);
    	}
    	return true;
    }
    

    und das meine AddTasks:

    int index = SendDlgItemMessage(hwnd, IDC_TASKLIST, LB_ADDSTRING, 0, (LPARAM)pcWinTitle); // Fügt Tasks in die ListBox
    


  • Probier mal das:

    #include <Windows.h>
    #include "Resource.h"
    
    HWND hlbxDest;
    
    BOOL CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char* pszCmdLine, int iCmdShow)
    {
    	return (DialogBox(hInst, MAKEINTRESOURCE(IDD_MAINDLG), NULL, DialogProc));
    }
    
    BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
    {
    	UINT uiLength = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0L);
    	PTCHAR pszWndText = new TCHAR[uiLength + 1];
    	SendMessage(hwnd, WM_GETTEXT, uiLength + 1, (LPARAM)pszWndText);
    	SendMessage(hlbxDest, LB_ADDSTRING, 0, (LPARAM)pszWndText);
    	delete [] pszWndText;
    	return (TRUE);
    }
    
    BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam)
    {
        switch(uiMessage)
        {
    
    	case WM_INITDIALOG:
    		hlbxDest = GetDlgItem(hwndDlg, IDC_TASKLIST);
    		EnumWindows((WNDENUMPROC)EnumWindowProc, 0);
    		return TRUE;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
            	case IDOK:
            	case IDCANCEL:
                	    SendMessage(hwndDlg, WM_CLOSE, 0, 0L);
                	    return (TRUE);
            }
            return (FALSE);
    
        case WM_CLOSE:
        case WM_DESTROY:
            EndDialog (hwndDlg, 0);
            return (TRUE);
        }
        return (FALSE);
    }
    

    WICHTIG: Sowohl PostQuitMessage als auch DestroyWindow haben in einer DialogProc nichts zu suchen. Vllt guckst du dir nochmal ein Tut an.

    PS: Hab den Code nicht getestet .



  • Danke, es funktioniert. 🙂

    MFG MrBigBrain


Anmelden zum Antworten