
今C++でタスクバーのウインドの列挙を行い、またプロセスIDの取得を
できたのですがこれらを終了させる方法がわかりません。
いろいろ調べてみたのですが、UNIXでのkillコマンドに匹敵する
関数がわかりません。
自分が調べたところ使えそうなのは。
CloseMainWindow関数
TerminateProcess関数
などができそうなのではと考えています。
また
http://akky.cjb.net/mfc/appclose.html
ここに書いてあるソースを打ってみたのですが、
思うように動きませんでした。
どうしたらよいでしょうか。
具体的な方法(プログラム)がほしいです。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
★アドバイス
・ウインドウの列挙は出来ているのならばそのウインドウ・ハンドルを使って
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を使用し
開発しています。
どうかよろしくお願いします。
すいませんたぶん自己解決したようです。
プロセスIDにこだわっていたので、ウインドウハンドルで終了させる
ようにしてみたら意外と簡単に終了させることができました。
またお世話になるかもしれませんがどうもありがとうございました。
No.3
- 回答日時:
対象のプロセスのウィンドウにWM_CLOSEを送る方法では、
WM_CLOSEやWM_DESTROYメッセージをプロシージャに書いているのに、
何も処理を書いていないアプリケーションなどの
行儀の悪いアプリケーションを殺せない可能性があります。
#監視系のウィルス対策ソフトや暗号化ソフトでは時々あります。
TerminateProcess関数にはPROCESS_TERMINATEのアクセス権が必要で
列挙したプロセスのハンドルにはこれが無い可能性があるため、
プロセスIDからOpenProcess関数などでこのアクセス権設定をして
プロセスハンドルを取得する事で、TerminateProcess関数を
使用することが出来ます。
#基本的にはPROCESS_ALL_ACCESSでOKですが:-p
No.1
- 回答日時:
>ここに書いてあるソースを打ってみたのですが
少なくとも全く同じでは無いはずなので、
あなたが書いたコードを載せたほうが早いのではないでしょうか?
>思うように動きませんでした。
>具体的な方法(プログラム)がほしいです。
どのように動くと思ったのかわかりませんし、
どのような結果になってほしいのかもわからないので
何とも言えません。。。
補足をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
IISがフリーズ
-
シェルで親プロセス終了時に子...
-
起動中のプロセスのメモリを書...
-
ウインドウのプロセス終了について
-
外部プロセスを終了したい!!
-
VB6.0 SHELLで起動...
-
VB.NETで起動したExcelの閉じ方...
-
非表示になったエクセルは?
-
sleep関数の精度について
-
API関数 GetExitCodeProcess
-
C#でのbatファイル実行結果取得
-
既存プロセスからプロセスのプ...
-
VBAで別プロセスのExcelのフル...
-
[C#]リモートコンピューターを...
-
Linux環境におけるgetprocs関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
C#でのbatファイル実行結果取得
-
Process.Startの戻り値を後で取得
-
タスクマネージャーのプロセス...
-
SendMessageが失敗するときがある
-
VB6.0 SHELLで起動...
-
Linuxでのスレッド間メッセージ...
-
vb.netでEXCEL起動がうまくでき...
-
explorer.exeが異様にメモリを食う
-
プロセスIDの取得方法について
-
IISがフリーズ
-
jdbcのプロセスの処理について
-
c言語でプロセスIDを調べたい
-
セマフォとmutexの違いは?
-
警告『 別のプロセスで使用され...
-
ADOでアクセスのレコードに...
-
OSPFでプロセスを分ける意義に...
-
Windowsでのfork方法
おすすめ情報