単純に WM_CLOSE 内で待ち合わせなければ問題ないかと思います。定期的にプロセスの終了を監視するために WM_TIMER を使うと以下のようになります。
C++
1case WM_CREATE:
2 // WM_CREATE でなくても CreateProcess に成功した後で SetTimer すれば良い。
3 SetTimer( hWnd, 1, 200, NULL );
4 break;
5
6case WM_CLOSE:
7 SendMessage( appHwnd, WM_CLOSE, 0, 0L );
8 return 0; // DefWindowProc に渡さない。
9
10case WM_TIMER:
11 if( wParam == 1 )
12 {
13 if( WaitForSingleObject( pi.hProcess, 0 ) == WAIT_OBJECT_0 ) // プロセスの終了をチェックするだけで待機しない。
14 {
15 CloseHandle( pi.hProcess );
16 DestroyWindow( hWnd );
17 }
18 }
19 break;
WM_TIMER を使うのが嫌ならメッセージループ側でプロセスの終了を待機しても良いかと思います。以下が例ですが、WM_CLOSE で終了要求を送信しても自アプリを終了しないようにするのは同じです。
C++
1// メッセージループ
2bool continueMessageLoop = true;
3while( continueMessageLoop )
4{
5 DWORD result = MsgWaitForMultipleObjects( 1, &pi.hProcess, FALSE, INFINITE, QS_ALLEVENTS );
6 if( result == WAIT_OBJECT_0 )
7 {
8 CloseHandle( pi.hProcess );
9 DestroyWindow( hWnd ); // hWnd は WM_TIMER 時と同じもの
10 // pi.hProcess が常にシグナル状態となるので、プロセス終了後に MsgWaitForMultipleObjects 呼び出しが成立しない。
11 // WM_DESTROY で PostQuitMessage せずに終了した方が良い。
12 break;
13 }
14 else if( result == WAIT_OBJECT_0 + 1 )
15 {
16 MSG msg;
17 while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
18 {
19 switch( msg.message )
20 {
21 case WM_QUIT:
22 // 多分、ここには来ない。
23 continueMessageLoop = false;
24 break;
25 default:
26 TranslateMessage( &msg );
27 DispatchMessage( &msg );
28 break;
29 }
30 }
31 }
32}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。