Wie könnte GetWindowFromProcess() aussehen?



  • Der Prozess hat ein Fenster, Titel unbekannt.

    Ich möchte durch den handle des prozesses den handle des einzigen fensters eben dessen bekommen.

    MfG



  • Alle fenster durchgehen (EnumWindows() oder so) und mit z.b. GetWindowThreadProcessId() die Prozess ID mit der von deinem Prozess vergleichen. An alle Prozess IDs kommst z.b. mit CreateToolhelp32Snapshot().



  • Okay danke wird schon klappen.

    MfG



  • Habs aber nicht getestet:

    #include <vector>
    #include <assert.h>
    #include <windows.h>
    
    typedef std::vector<HWND> ProcessWindows;
    
    BOOL CALLBACK WndFromProcessProc(HWND,LPARAM);
    
    struct STransmitData
    {
        DWORD           dwPID;
        ProcessWindows* pWnds;
        bool            fSkip;
    };
    
    bool GetWindowFromProcess(DWORD dwPID, ProcessWindows& cwdWindows, bool fSkipChilds)
    {
       STransmitData tdData;
       tdData.dwPID = dwPID;
       tdData.pWnds = &cwdWindows;
       tdData.fSkip = fSkipChilds;
       return (EnumWindows(WndFromProcessProc, reinterpret_cast<LPARAM>(&tdData)) != 0);
    }
    
    BOOL CALLBACK WndFromProcessProc(HWND hWnd, LPARAM lParam)
    {
       STransmitData* pData = reinterpret_cast<STransmitData*>(lParam);
    
       assert(pData);
    
       DWORD dwPID;
       GetWindowThreadProcessId(hWnd, &dwPID);
       if(pData->dwPID == dwPID)
       {
          if(!fSkipChilds)
             pData->pWnds->push_back(hWnd);
          else if(GetWindow(hWnd, GW_CHILD))
             pData->pWnds->push_back(hWnd);
       }
       return (TRUE);
    }
    


  • Oh das wäre nicht nötig gewesen, habs schon geschafft.
    Aber trotzdem danke.

    MfG



  • Willste eventuell ne kleine Entschädigung das du den Code geschrieben hast?



  • ceplusplus@loggedoff schrieb:

    Willste eventuell ne kleine Entschädigung das du den Code geschrieben hast?

    Och, wenne schon so fragst, ich schick Dir die Rechnung 🕶 .

    Aber Du kannst mir mal Deine Version zeigen, würd mich mal interessieren 💡 .



  • CodeFinder, Dein Trolldetektor funktioniert nicht. 🙂
    Da ist grade so ein Idiot, der sich die Namen von bekannten "UnRegs" nimmt und damit herumtrollt.



  • 🙂



  • Ist ziemlich verbaut und schon wieder verschmissen, aber hier:

    bool __stdcall windowEnumerateProcess(HWND windowHandle, LPARAM lParam)
    {
    	DWORD currentProcessId;
    
    	GetWindowThreadProcessId(windowHandle, &currentProcessId);
    
    	if(currentProcessId == KlasseA::getInstance().getServerProcessId())
    		KlasseA::getInstance().setServerWindowHandle(windowHandle);
    
    	return true;
    }
    
    serverProcessSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    		serverProcessEntry.dwSize = sizeof(serverProcessEntry);
    		handleFound = Process32First(serverProcessSnapShot, &serverProcessEntry);
    
    		for(; handleFound; handleFound = Process32Next(serverProcessSnapShot, &serverProcessEntry))
    		{	
    			serverProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, false, serverProcessEntry.th32ProcessID);		
    
    			rowHelper = serverProcessEntry.szExeFile;		
    
    			if(rowHelper == dataBase[0])		
    			{
    				// MessageBox(NULL, "vcded.exe found", "", MB_OK);
    				serverProcessId = serverProcessEntry.th32ProcessID;
    				EnumWindows(reinterpret_cast<WNDENUMPROC>(windowEnumerateProcess), 0);
    
    				serverListBoxHandle = FindWindowEx(serverWindowHandle, 0, "ListBox", 0);
    				serverEditFieldHandle = FindWindowEx(serverWindowHandle, 0, "Edit", 0);
    
    				EnableWindow(buttonHandles[1], true);
    				SendMessage(labelHandle, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(" Server: FOUND"));
    
    				break;
    			}
    		}
    

    MfG


Anmelden zum Antworten