Last Updated 2004/12/21
API

プロセスの終了


CreateProcess() で起動させたアプリを終了させる.

以下の様にプロセスハンドルとスレッドハンドルをクローズしてもアプリケーション
を終了させるということにはならない.
   CloseHandle(procInfo.hThread);       // procInfo は CreateProcess に
   CloseHandle(procInfo.hProcess);      // 渡す引数


TerminateProcess() や TerminateThread() は緊急遮断に使用するもので
あり,終了するが正常な終了方法ではない.

WM_CLOSE を送信するのが一番いいが,その送信先のウィンドウハンドルの取得が
問題である.FindWindow() での検索は同じクラス名の別のアプリを終了させたい
場合に不都合がある.

CreateProcess() にて起動したアプリケーションであればプロセスIDが分かるの
でそこから該当のウィンドウを検索する.
トップレベルウィンドウを検索して,そのプロセスIDが CreateProcess() で起
動したアプリケーションのプロセスIDと合致すれば,それが終了させるウィン
ドウハンドルである.


BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
  DWORD dwThreadId, dwProcessId;

  dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
  if (dwProcessId == (DWORD)lParam) {
    PostMessage(hwnd, WM_CLOSE, 0, 0);
  }

  return TRUE;
}


  // pi は CreateProcess() したときの PROCESS_INFORMATION
  EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);

2004/03/03

参照
CreateProcess
アプリケーション終了方法
クラス内コールバック関数
プロセスIDでプロセス強制終了


API