Niby proste używając CreateProcess i WaitForSingleObject ale co zrobić gdy ten obcy program uruchamia się na raty (najpierw jedno okno i zaraz po nim główny program) i wygląda na to, że funkcja WaitForSingleObject dotyczy tego pierwszego okna i po jego samoczynnym zamknięciu odblokowuje mój program. Proszę o sugestie co z tym fantem zrobić.
Po uruchomieniu procesu można przy wspomnianej funkcji w jednej ze struktur uzyskać PID procesu. następnie uzyskać poprzez GetWindowThreadProcessId
sprawdzenie czy okno należy do PID'u/a uruchomionego procesu. Można dodatkowo w osobnym wątku enumerować wszystkie okna poprzez EnumWindows
wykrywać czy już istnieje konkretne okno. Porównując jego klasę i/lub tytuł okna. Tak ja bym spróbował kombinowac. Więcej o wspomnianych konstrukcjach spokojnie znajdziesz w G.
A co tu mają do rzeczy jakieś okna?
Wsadzasz handle procesu w ten WaitFor, a nie jakiegoś okna.
Tu masz nawet cały gotowiec:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx
Też się z tym woziłem. Problem pojawia się gdy np aplikacja którą uruchamiasz ma splashscreena. Ja akurat robiłem aplikację, która dokowała otwieraną aplikację na TTabSheet w mojej aplikacji. Ja akurat nie robiłem tego przez createprocess ShellExecute, a dokładnie ShellExecuteEx. Następnie poprzez taki np testowy kod i funkcję EnumChildWindows:
function EnumChildren(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
TextBoxClass = 'Favorite directories (F2)';
var
ClassName: array[0..259] of Char;
begin
Result := True;
GetClassName(hwnd, ClassName, Length(ClassName));
Windows.GetWindowText(hwnd,classname,length(ClassName));
if ClassName = TextBoxClass then
TStrings(lParam).Add('Hurra');
end;
procedure Check();
var
h: THandle;
begin
inherited;
h := GetHWndByPID(GetProcesID('PROCES.exe'));
EnumChildWindows(h, @EnumChildren, UINT_PTR(Memo1.Lines));
if pos('Hurra', Memo1.Lines.Text) > 0 then
begin
//twój kod
end;
end;
Dzięki temu wszystkie potomne okna z procesu 'PROCES.exe' będziesz w stanie przeanalizować. Jak widzisz w podanym przykładzie ja szukam okna którego title jest równy: Favorite directories (F2) jeśli się znajdzie to ja do memo wpisuję 'Hurra' - to jest oczywiście wersja testowa więc nie sugeruj się tym captionem memo itd. To jest tylko przykład jak możesz wyszukać okna potomne po numerze procesu przy wykorzystaniu EnumChildWindows.