今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で質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルでのエクスプローラー終了 1 2022/05/30 14:32
- Excel(エクセル) 該当日が期間内に当てはまる場合、開始日と終了日をExcel関数を用いて入力させたい 4 2022/11/21 09:47
- Excel(エクセル) Excelで行削除をすると… 1 2023/07/26 11:57
- 政治 私は文部科学省ヘ入り込んで投稿した私の建議文を彼らが私の依頼まましましょうか。? 2 2023/08/22 07:08
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Excel(エクセル) エクセルの関数について 5 2023/01/26 15:26
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- インターネット広告・アフィリエイト アフェリエイトサイト 作成について 5 2022/05/13 21:31
- 数学 数学A、確率の問題です。 nを4以上の自然数とする。数字の1からnが書かれたカードが1枚ずつ、合計n 3 2023/07/02 22:54
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
-
WINのタスクマネージャの強制終了
C言語・C++・C#
-
Windowsでのfork方法
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
6
実行時のコマンドプロンプトを非表示 Visual C++
C言語・C++・C#
-
7
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
C#でのbatファイル実行結果取得
-
共有メモリの同時アクセスにつ...
-
バッチファイルでPINGログ取得
-
C++でシェルを起動
-
SendMessageが失敗するときがある
-
非表示になったエクセルは?
-
プロセスIDの取得方法について
-
デスクトップ上のアイコン名の...
-
VB6.0 SHELLで起動...
-
「便宜上分かりやすいから」「...
-
sleep関数の精度について
-
c言語でプロセスIDを調べたい
-
Linuxでのスレッド間メッセージ...
-
IISがフリーズ
-
C言語 特定のプロセスの終了を...
-
GPLによるソース公開の回避方法
-
変数のアドレスの値
-
スレッド?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
popen について
-
C++のプログラムをバックグラウ...
-
非表示になったエクセルは?
-
Windowsでのfork方法
-
別のプロセスの関数を呼び出す...
-
sleep関数の精度について
-
Visual C++からpingを実行して...
-
ADOでアクセスのレコードに...
-
C++でシェルを起動
-
SendMessageが失敗するときがある
-
ウィンドウのタイトルからプロ...
-
OSPFでプロセスを分ける意義に...
おすすめ情報