dポイントプレゼントキャンペーン実施中!

今C++でタスクバーのウインドの列挙を行い、またプロセスIDの取得を
できたのですがこれらを終了させる方法がわかりません。
いろいろ調べてみたのですが、UNIXでのkillコマンドに匹敵する
関数がわかりません。
自分が調べたところ使えそうなのは。
CloseMainWindow関数
TerminateProcess関数
などができそうなのではと考えています。
また
http://akky.cjb.net/mfc/appclose.html
ここに書いてあるソースを打ってみたのですが、
思うように動きませんでした。
どうしたらよいでしょうか。
具体的な方法(プログラム)がほしいです。
よろしくお願いします。

A 回答 (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 関数などを使います。
以上。

この回答への補足

その節はお世話になりありがとうございました。
少し補足させていただきますと今作製しようとしてるソフトは
遠隔監視(起動中のアプリケーション、メッセージを送るなど)を
複数名でやっています。自分の分担ではこのウインドウの表示、
またそのウインドウの終了をさせようとしています。
そのためクライアントからサーバ側にプロセス名、プロセスIDを
送り、サーバ側からプロセスIDをクライアントに送りアプリケーションを終了させようとしているところです。そのためTerminateProcess関数
でもよいかと思い乗せたしだいです。WM_CLOSEでは
ウインドウズハンドルなのでプロセスIDでの終了を組みたいと
考えていましたので、できましたならアドバイスをお願いします。
前述したリンクのソースである程度までは推測していますが、
なにぶん実力不足のためうまく組めないのが現状です。
ちなみにソフト開発はJAVAメインとなっており私はJNIを使用し
開発しています。
どうかよろしくお願いします。

補足日時:2007/12/05 12:19
    • good
    • 0
この回答へのお礼

すいませんたぶん自己解決したようです。
プロセスIDにこだわっていたので、ウインドウハンドルで終了させる
ようにしてみたら意外と簡単に終了させることができました。
またお世話になるかもしれませんがどうもありがとうございました。

お礼日時:2007/12/05 13:48

対象のプロセスのウィンドウにWM_CLOSEを送る方法では、


WM_CLOSEやWM_DESTROYメッセージをプロシージャに書いているのに、
何も処理を書いていないアプリケーションなどの
行儀の悪いアプリケーションを殺せない可能性があります。
#監視系のウィルス対策ソフトや暗号化ソフトでは時々あります。

TerminateProcess関数にはPROCESS_TERMINATEのアクセス権が必要で
列挙したプロセスのハンドルにはこれが無い可能性があるため、
プロセスIDからOpenProcess関数などでこのアクセス権設定をして
プロセスハンドルを取得する事で、TerminateProcess関数を
使用することが出来ます。
#基本的にはPROCESS_ALL_ACCESSでOKですが:-p
    • good
    • 0
この回答へのお礼

なるほどWM_CLOSEだけではだめな場合もあるわけですね。
どうもご指摘ありがとうございました。

お礼日時:2007/12/06 17:25

>ここに書いてあるソースを打ってみたのですが


少なくとも全く同じでは無いはずなので、
あなたが書いたコードを載せたほうが早いのではないでしょうか?

>思うように動きませんでした。
>具体的な方法(プログラム)がほしいです。
どのように動くと思ったのかわかりませんし、
どのような結果になってほしいのかもわからないので
何とも言えません。。。

補足をお願いします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!