Как определить, когда появиющийся процесс готов? (Использование CreateProcess () и FindWindow ())

StackOverflow https://stackoverflow.com/questions/4107499

  •  29-09-2019
  •  | 
  •  

Вопрос

Это должно быть легко: я создаю программу, которая порождает процесс, используя 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 Звонки, это работает нормально. Но это чувствует себя как очень плохой взлом.

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

Это было полезно?

Решение

(Редактировать): Пользователь iinsepectable указал проблемы с WaitForInputIdle(), и предложил CBT-крючки вместо.

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

Кроме того, CBT не хватает компьютерной подготовки по любой причине.

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

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

Другие советы

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

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

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

  • Вы можете позволить второму процессу опубликовать сообщение первым, когда он готов, если второе знает необходимые детали окна сообщения первого процесса.
  • Или вы можете дождаться первого процесса для согласованного объекта с именованным синхронизацией, как событие или Mutex, устанавливаемые из второго процесса.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top