Как определить, когда порожденный процесс готов? (Используя CreateProcess () и FindWindow ()) - PullRequest
8 голосов
/ 05 ноября 2010

Это должно быть легко: я создаю программу, которая порождает процесс, используя функцию win32 CreateProcess(). Как только этот процесс загружен, я нахожу его окно с помощью FindWindow и отправляю ему сообщения с использованием SendMessage(). Вопрос в том, как узнать, когда это окно готово принимать сообщения?

Рассмотрим следующее:

HWND wnd;

BOOL Start()
{
  // Spawn the process
  if (! CreateProcess(...))
    return FALSE;

  // Find the process's window (class and name already known)
  wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME);

  // Always returns FALSE because window has not yet been created.
  return (wnd != NULL);
}

Код выше (почти?) Всегда будет неудачным; окно не может быть создано и найдено так быстро. Если я поставлю ожидание потока, скажем Sleep(1000), между вызовами CreateProcess и FindWindow, оно будет работать нормально. Но это похоже на очень плохой взлом.

Как я могу улучшить это?

Ответы [ 4 ]

9 голосов
/ 05 ноября 2010

(Изменить): Пользователь IInspectable указал на проблемы с WaitForInputIdle() и предложил вместо этого CBT Hooks .

(...) функция обратного вызова, используемая с SetWindowsHookEx функция. Система вызывает эту функцию перед активацией, создание (...) окна; (... многое другое).

Кроме того, CBT - сокращение от компьютерного обучения, по любой причине.

(Старый, будьте осторожны, см. Комментарии.) Вы ищете WaitForInputIdle () . Цитата:

Когда родительский процесс создает дочерний процесс, функция CreateProcess возвращается, не дожидаясь ребенка процесс, чтобы закончить его инициализацию. Прежде чем пытаться общаться с дочерний процесс, родительский процесс может используйте функцию WaitForInputIdle для определить, когда ребенок инициализация завершена.

2 голосов
/ 05 ноября 2010

Вы смотрели на WaitForInputIdle ?

1 голос
/ 05 ноября 2010

Я предполагаю, что исходный код обоих процессов находится под вашим контролем.

  • Вы можете разрешить второму процессу отправлять сообщение первому, когда оно будет готово, если второму известны необходимые деталиокно сообщения первого процесса.
  • Или вы можете подождать в первом процессе согласованного именованного объекта синхронизации, такого как событие или мьютекс, из второго процесса.
1 голос
/ 05 ноября 2010

Если процесс, который вы запускаете, можно изменить, отправьте сообщение обратно родителю, когда он будет готов.Вы можете передать HWND родителя в качестве параметра командной строки или использовать FindWindow, если можете гарантировать, что родитель будет уникальным.

...