ShowWindow() funktioniert nicht zuverlässig



  • Ich versuche krampfhaft, ein anderes Programm zu maximieren.
    Folgende vorgehensweise:

    Da sich der Titel des Fensters ändert, kann ich das Handle nicht per FindWindow() ermitteln. Stattdessen ermittle ich die ProzessID über den Exe-Namen. Alles funktioniert einwandfrei, außer die Funktion

    ShowWindow(Fensterhandle, SW_SHOWMAXIMIZED);
    

    Lasse ich sie weg, befördert

    BringWindowToTop(Fensterhandle)
    

    das andere Fenster nach vorne, solange es im Hintergrund maximiert war. Habe ich es beim letzten Mal minimiert, anstatt mein eigenes Programm in der Taskleiste auszuwählen, kommt es nicht mehr in den Vordergrund. Nun erwarte ich von "ShowWindow(Fensterhandle, SW_SHOWMAXIMIZED);" eigentlich, dass es ein Fenster maximiert. Das einzige, was passiert ist, dass ich das Programm nach Ausführung des Befehls noch nicht einmal mehr mit "Alt+Tab" finde.

    Wo liegt der Fehler?

    HANDLE Handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	PROCESSENTRY32 pe;
    	pe.dwSize = sizeof(pe);
    	bool bFenstergefunden;
    
    	if (Process32First(Handle, &pe))
    	{
    		while (Process32Next(Handle, &pe))
    		{
    			if ((AnsiString)pe.szExeFile == "In-Sight Explorer.exe")
    			{
    				HWND Fensterhandle = GetTopWindow(0);
    				while(Fensterhandle)
    				{
    					DWORD pid;
    					DWORD dwTheadId = GetWindowThreadProcessId(Fensterhandle, &pid);
    					if (pid == pe.th32ProcessID)
    					{
    						ShowWindow(Fensterhandle, SW_SHOWMAXIMIZED);
                            BringWindowToTop(Fensterhandle);
    						bFenstergefunden = true;
    						break;
    					}
    					Fensterhandle = GetNextWindow(Fensterhandle, GW_HWNDNEXT);
    
    				}
    			}
    		}
    		if (!bFenstergefunden)
    		{
    			AnsiString ASProgrammordner = Form_Main->ProgrammordnerAuslesen();
    			ASProgrammordner += "\\Cognex\\In-Sight\\In-Sight Explorer 4.1.1\\In-Sight Explorer.exe";
    			ShellExecute(NULL, NULL, ASProgrammordner.c_str(), NULL, NULL, SW_SHOWNORMAL);
    		}
    
    	}
    	CloseHandle(Handle);
    


  • hat zwar jetzt nichts mit deinem Problem zu tun, aber statt

    DWORD pid;
    DWORD dwTheadId = GetWindowThreadProcessId(Fensterhandle, &pid);
    

    kannst du auch einfach nur

    DWORD pid;
    GetWindowThreadProcessId(Fensterhandle, &pid);
    

    schreiben. GetWindowThreadProcessId gibt nur was zurück, wenn der letzte Parameter NULL ist, wenn da ne Variable steht, dann wird die ID da rein gepackt. Ist mir nur grad beim Codeanschauen aufgefallen. 😉

    greetz KN4CK3R



  • Probier mal ShowWindowAsync().



  • Interessanterweise wird das fremde Fenster aufgerufen, aber der Inhalt ist schwarz. Drücke ich Alt+F4, wird das aufgerufene Fenster geschlossen.
    Leider fehlt mir der Inhalt 😞
    Das passiert mit der normalen ShowWIndow()-Funktion als auch mit der ShowWindowASync()-Funktion.
    Leider habe ich immernoch keine Lösung.


Log in to reply