Auf HWND von Prozess warten
-
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { char title[512]; GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0])); string str(title); if(str == "Rechner") { cout << "Rechner gefunden!" << endl; if(IsWindowVisible(hWnd)) ShowWindow(hWnd, SW_HIDE); } return true; }funktioniert problemlos. Es flimmert kurz dort, wo das Fenster ist/war und dann verschwindet es, und ist nur noch in der Prozessliste der Taskmanagers zu sehen. Zum Testen eignet sich wohl besser ShowWindow(hWnd, SW_MINIMIZE); - auch das funktioniert und der Rechner findet sich in der Taskleiste wieder ...
-
Belli schrieb:
funktioniert problemlos. Es flimmert kurz dort, wo das Fenster ist/war und dann verschwindet es, und ist nur noch in der Prozessliste der Taskmanagers zu sehen. Zum Testen eignet sich wohl besser ShowWindow(hWnd, SW_MINIMIZE); - auch das funktioniert und der Rechner findet sich in der Taskleiste wieder ...
Offenbar ist dein Computer schneller als meiner beim Laden, denn der von dir gepostete Code funktioniert nur wenn ich vor IsWindowVisible(hWnd) eine Sleep(500) Funktion einbaue.

Und hier wären wir wieder beim Thema.. wie lange benötigt das Fenster bis es vom Prozess angezeigt wird und vollständig sichtbar ist, denn zur Zeit der Abfrage ist das Fenster anscheinend zwar bereits am Laden jedoch nicht sichtbar, und kann somit nicht manipuliert werden. (ShowWindow)
Hier Hilft auch kein erneuertes WaitForInputIdle vor der IsWindowVisible Abfrage einzubauen.

Und ich bräuchte eine Funktion um genau dieses Problem zu lösen

-
Dann bin ich überfragt, laut MSDN
The WaitForInputIdle function enables a thread to suspend its execution until a specified process has finished its initialization and is waiting for user input with no input pending.
sollte der Prozess bereits in der Lage sein, User - Input anzunehmen, also sollte es nach der Rückkehr von WaitForInputIdle schon möglich sein, in das Eingabefeld zu tippen, mithin müsste das Fenster auch längst sichtbar sein ...
Wenn das bei Dir nicht so ist, kann ich Dir nicht weiter behilflich sein.
-
Belli schrieb:
Dann bin ich überfragt, laut MSDN
The WaitForInputIdle function enables a thread to suspend its execution until a specified process has finished its initialization and is waiting for user input with no input pending.
sollte der Prozess bereits in der Lage sein, User - Input anzunehmen, also sollte es nach der Rückkehr von WaitForInputIdle schon möglich sein, in das Eingabefeld zu tippen, mithin müsste das Fenster auch längst sichtbar sein ...
Wenn das bei Dir nicht so ist, kann ich Dir nicht weiter behilflich sein.
Danke dir für den Versuch

Edit: *kopf->tisch*.. mir ist gerade eingefallen, dass man einen Loop vor dem Anzeigen des Fensters einbauen kann:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { char title[512]; GetWindowText(hWnd, title, sizeof(title)/sizeof(title[0])); string str(title); if(str == "Rechner") { cout << "Rechner gefunden!" << endl; int xx; do { xx++; cout << xx << endl; //LADEZEIT ausgeben } while (!IsWindowVisible(hWnd)); //NUN ist das Fenster auch sichtbar ShowWindow(hWnd, SW_HIDE); } return true; }somit wartet das Programm bis auch das Fenster sichtbar / geladen ist

-
Naja, da hast Du aber eine busy-loop, das ist nicht besonders glücklich; ersetz das xx++ durch zB Sleep(20), dann kriegt die CPU zwischendurch ein bisschen Luft.
-
ersetz das xx++ durch zB Sleep(20), dann kriegt die CPU zwischendurch ein bisschen Luft
nicht nur das, ich würd mir da noch nen timer einbauen, das gesetzt dem fall der process das fenster nicht erzeugt, dein prog. irgendwann selbst den weg aus der schleife findet. bzw. nachfrägt, ob es die schleife beenden darf o. nicht.