指定のウィンドウを持つアプリケーションを強制終了させる

「蛭子屋うぃん」ではアプリケーションを強制終了させるコマンドがあります。これは大抵のウィンドウの場合、 WM_CLOSE を送ることで終了してくれるのですが、リソースメーターなど一部のアプリケーションでは終了してくれません。これらのアプリを無理矢理終了させるためのコマンドです。

実はこれらのウィンドウは往々にして WM_COMMAND であるコマンドを送ることで終了してくれるのですが、このあるコマンドが外部からでは判りません(リソースを読んだり、SPY++等のツールを使ったり、内部を解析したりすることで調べることはできますが)。

ところが、アプリケーション自体(アプリケーションのプロセス)を強制終了させるAPI、 TerminateProcess に渡す引数にはプロセスのハンドルが必要です。しかし、 GetWindowThreadProcessId ではプロセスのIDは取得できますが、ハンドルは得られません。そこで OpenProcess というAPIを使用します。

(例)指定のウィンドウを持つプロセスを強制終了させる。

DWORD dwPID;
DWORD dwTID = ::GetWindowThreadProcessId(hWnd, &dwPID);
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if (hProcess != NULL)
::TerminateProcess(hProcess, (UINT) -1);

戻る