- ベストアンサー
ウインドウのプロセス終了について
今C++でタスクバーのウインドの列挙を行い、またプロセスIDの取得を できたのですがこれらを終了させる方法がわかりません。 いろいろ調べてみたのですが、UNIXでのkillコマンドに匹敵する 関数がわかりません。 自分が調べたところ使えそうなのは。 CloseMainWindow関数 TerminateProcess関数 などができそうなのではと考えています。 また http://akky.cjb.net/mfc/appclose.html ここに書いてあるソースを打ってみたのですが、 思うように動きませんでした。 どうしたらよいでしょうか。 具体的な方法(プログラム)がほしいです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・ウインドウの列挙は出来ているのならばそのウインドウ・ハンドルを使って WM_CLOSE メッセージを送れば良いでしょう。 以前、GetWindowThreadProcessId 関数の使い方を質問した方ですね。 ・プロセスを終了するだけなら次の1行で出来ると思います。 SendMessage( 列挙したウインドウのハンドル, WM_CLOSE, 0, 0 ); これ1行です。 ・なお、TerminateProcess 関数は強制的にプロセスを終了させるかなり強引な 方法です。この方法はあまりお勧めできません。 理由はメモ帳などでまだ保存されていないデータは失われます。 WM_CLOSE メッセージなら確認のダイアログなどが出ると思います。 強制的にプロセスを終了させる場合以外は TerminateProcess 関数は使わないこと。 ・参考にしているサイトは自ら起動したプロセスを GetWindowThreadProcessId 関数を 使ってプロセスIDをチェックしています。また、このサイトでも終了させる方法に PostMessage( hWnd, WM_CLOSE, 0, 0 ); としています。既に答えが書かれていますよ。(笑) サンプル: int main( void ) { HWND hWnd; // 列挙したウインドウハンドルの代わり hWnd = FindWindow( "Notepad", NULL ); if ( hWnd != NULL ){ printf( "メモ帳を終了します。-- pause --\n" ); getchar(); PostMessage( hWnd, WM_CLOSE, 0, 0 ); } else{ printf( "メモ帳を起動してから実行して下さい。\n" ); } return 0; } メモ帳に何か文字を入力してから実行してみると終了しようとしたときにメモ帳から 保存の確認ダイアログが出ます。これを出さずに強制終了させたい場合には TerminateProcess 関数などを使います。 以上。
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
対象のプロセスのウィンドウにWM_CLOSEを送る方法では、 WM_CLOSEやWM_DESTROYメッセージをプロシージャに書いているのに、 何も処理を書いていないアプリケーションなどの 行儀の悪いアプリケーションを殺せない可能性があります。 #監視系のウィルス対策ソフトや暗号化ソフトでは時々あります。 TerminateProcess関数にはPROCESS_TERMINATEのアクセス権が必要で 列挙したプロセスのハンドルにはこれが無い可能性があるため、 プロセスIDからOpenProcess関数などでこのアクセス権設定をして プロセスハンドルを取得する事で、TerminateProcess関数を 使用することが出来ます。 #基本的にはPROCESS_ALL_ACCESSでOKですが:-p
お礼
なるほどWM_CLOSEだけではだめな場合もあるわけですね。 どうもご指摘ありがとうございました。
- aris-wiz
- ベストアンサー率38% (96/252)
>ここに書いてあるソースを打ってみたのですが 少なくとも全く同じでは無いはずなので、 あなたが書いたコードを載せたほうが早いのではないでしょうか? >思うように動きませんでした。 >具体的な方法(プログラム)がほしいです。 どのように動くと思ったのかわかりませんし、 どのような結果になってほしいのかもわからないので 何とも言えません。。。 補足をお願いします。
お礼
すいませんたぶん自己解決したようです。 プロセスIDにこだわっていたので、ウインドウハンドルで終了させる ようにしてみたら意外と簡単に終了させることができました。 またお世話になるかもしれませんがどうもありがとうございました。
補足
その節はお世話になりありがとうございました。 少し補足させていただきますと今作製しようとしてるソフトは 遠隔監視(起動中のアプリケーション、メッセージを送るなど)を 複数名でやっています。自分の分担ではこのウインドウの表示、 またそのウインドウの終了をさせようとしています。 そのためクライアントからサーバ側にプロセス名、プロセスIDを 送り、サーバ側からプロセスIDをクライアントに送りアプリケーションを終了させようとしているところです。そのためTerminateProcess関数 でもよいかと思い乗せたしだいです。WM_CLOSEでは ウインドウズハンドルなのでプロセスIDでの終了を組みたいと 考えていましたので、できましたならアドバイスをお願いします。 前述したリンクのソースである程度までは推測していますが、 なにぶん実力不足のためうまく組めないのが現状です。 ちなみにソフト開発はJAVAメインとなっており私はJNIを使用し 開発しています。 どうかよろしくお願いします。