第 号
|
Last Updated 2004/12/21
|
プロセスの終了
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でプロセス強制終了