Ein anderes Program aus meiner Anwendung herausstarten und kontrollieren
-
Hallo,
aus meiner Anwendung heraus möchte ich ein anderes Programm starten und auch dessen Position auf dem Desktop ändern und ggf. das Fenster auch verstecken, bzw. wieder sichtbar machen. Das gestartete Programm soll auch von meiner Anwendung heraus geschlossen werden können. Ich habe jetzt CreateProcess und ShellExecute entdeckt und bin mir nicht sicher was ich nun wie benutzen soll.
-
Starte mit CreateProcess dein Programm und lass dir den Handle geben.
Besorge dir mit GetThreadId die Thread Identifikationsnummer des Prozesses.
Durchlaufe mit EnumThreadWindows die Top-Fenster deines Programms, um dessen Handles zu sammeln.
Über Windows Funktionen lassen sich diese nun manipulieren.
-
Danke für die Hinweise, damit hab ichs hingekriegt.
-
Youka schrieb:
Besorge dir mit GetThreadId die Thread Identifikationsnummer des Prozesses.
Durchlaufe mit EnumThreadWindows die Top-Fenster deines Programms, um dessen Handles zu sammeln.Anmerkung: wenn die Applikation den nicht den "main Thread" verwendet um die GUI anzuzeigen wird das so nicht mehr funktionieren.
In dem Fall müsste man dann erstmal alle Threads des Prozesses ermitteln, und dann für jeden einzelnen mitEnumThreadWindows
nach Fenstern suchen.
-
Um die Startphase gut abzuwarten lohnt sich der Befehl WaitForInputIdle
-
hustbaer schrieb:
Anmerkung: wenn die Applikation den nicht den "main Thread" verwendet um die GUI anzuzeigen wird das so nicht mehr funktionieren.
In dem Fall müsste man dann erstmal alle Threads des Prozesses ermitteln, und dann für jeden einzelnen mitEnumThreadWindows
nach Fenstern suchen.Ich denke ich weiss was du meist, auf das Problem bin ich glaub ich gestossen, hab das so gelöst:
HWND MyFindWnd(DWORD myProcessId, DWORD myThreadId){ HWND hFind = 0; DWORD dwProcessId, dwThreadId; hFind = GetWindow(GetDesktopWindow(), GW_CHILD); while(hFind){ dwProcessId = 0; dwThreadId = GetWindowThreadProcessId(hFind, &dwProcessId); if((dwThreadId == myThreadId) && (dwProcessId == myProcessId)){ char ClassName[256]; GetClassName(hFind, ClassName, sizeof(ClassName)); if(!_stricmp(ClassName, "DPWindowClass")){ return hFind; } } hFind = GetWindow(hFind, GW_HWNDNEXT); } return 0; }
Wobei ich myProcessId und myThreadId beim Erstellen mit CreateProcess erhalten hatte. Den Classnme hatte ich zuvor mit Winspy++ bestimmt.