Ваш родительский процесс, кажется, зависает, потому что вызов WaitForSingleObject () блокирует ваш поток, пока не будет сигнализирован дескриптор, который вы передаете в вызов.
Ваш дочерний процесс, вероятно, зависает во время операции копирования в буфер обмена, поскольку он является частью этой операции, отправляя сообщение либо конкретно в окно родительского процесса, либо во все окна верхнего уровня. Цикл сообщений в потоке вашего родительского процесса не работает, поскольку он блокируется в ожидании завершения дочернего процесса, поэтому сообщение никогда не обрабатывается, а дочерний процесс остается заблокированным.
Вместо вызова WaitForSingleObject () вы можете вызвать MsgWaitForMultipleObjects () . Если вы укажете QS_ALLINPUT для параметра dwWaitMask, MsgWaitForMultipleObjects будет возвращать либо сигнал о вашем событии, либо когда есть вход в очередь сообщений потока. Если MsgWaitForMultipleObjects () возвратился из-за доступности сообщения, вы можете обработать его и возобновить ожидание:
MSG msg;
DWORD reason = WAIT_TIMEOUT;
while (WAIT_OBJECT_0 != reason) {
reason = MsgWaitForMultipleObjects(1, &hChildProcess, FALSE, INFINITE, QS_ALLINPUT);
switch (reason) {
case WAIT_OBJECT_0:
// Your child process is finished.
break;
case (WAIT_OBJECT_0 + 1):
// A message is available in the message queue.
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
// Note that if your main message loop does additional processing
// (such as calling IsDialogMessage() for modeless dialogs)
// you will want to do those things here, too.
}
break;
}
}