WaitForSingleObject() 呼び出しは、呼び出しに渡すハンドルが通知されるまでスレッドをブロックするため、親プロセスがハングしているように見えます。
子プロセスは、クリップボードへのコピー操作中にハングする可能性があります。これは、その操作の一部として、親プロセスのウィンドウまたはすべての最上位ウィンドウにメッセージを送信するためです。親プロセスのスレッドのメッセージ ループは実行されていません。これは、子プロセスが終了するまでブロックされ、メッセージが処理されず、子プロセスがブロックされたままになるためです。
WaitForSingleObject() を呼び出す代わりに、MsgWaitForMultipleObjects()を呼び出すことができます。dwWaitMask パラメータに QS_ALLINPUT を指定すると、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;
}
}