Uruchom obcy program i poczekaj na jego zamknięcie

0

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ć.

0

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.

1

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

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1