- ベストアンサー
ウインドウのプロセス終了について
今C++でタスクバーのウインドの列挙を行い、またプロセスIDの取得を できたのですがこれらを終了させる方法がわかりません。 いろいろ調べてみたのですが、UNIXでのkillコマンドに匹敵する 関数がわかりません。 自分が調べたところ使えそうなのは。 CloseMainWindow関数 TerminateProcess関数 などができそうなのではと考えています。 また http://akky.cjb.net/mfc/appclose.html ここに書いてあるソースを打ってみたのですが、 思うように動きませんでした。 どうしたらよいでしょうか。 具体的な方法(プログラム)がほしいです。 よろしくお願いします。
- voodoo4500
- お礼率57% (8/14)
- C・C++・C#
- 回答数3
- ありがとう数4
- みんなの回答 (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)
>ここに書いてあるソースを打ってみたのですが 少なくとも全く同じでは無いはずなので、 あなたが書いたコードを載せたほうが早いのではないでしょうか? >思うように動きませんでした。 >具体的な方法(プログラム)がほしいです。 どのように動くと思ったのかわかりませんし、 どのような結果になってほしいのかもわからないので 何とも言えません。。。 補足をお願いします。
関連するQ&A
- 外部プロセスを終了したい!!
こんにちは。 ご多忙の中、申し訳ありませんが皆さんの知恵をお貸しください。 私はVBは初心者中の初心者なのですが、 あるアプリケーションからEXEをキックし(このEXEは永久ループ)、 ある程度の処理をしたら、キックしたEXEを終了させたいと考えております。 基本的にキックされたEXEがウェイトして自らおちるのではなく、キックした アプリから落としたいと考えています。 簡単に言えば、UNIXでいうKILLコマンドのような関数はありますかと 言うことです。(プロセスIDを使用して・・・) ご存知の方がいらっしゃいましたら、教えてください。 宜しくお願い致します。m(_ _)m
- ベストアンサー
- Visual Basic
- プロセスIDの取得方法
Unix C++でプロセスIDの取得方法を教えてください。 (見当違いの質問だったらすみません) 親プロセス(自分)のプロセスIDと、親プロセスの起動した子プロセスのプロセスIDを取得したいです。 また、親プロセスの起動した子プロセスのプロセスIDを使って親プロセス終了時に子プロセスをkillしたいと思うのですが、 具体的にどうすればいいかわからず困っています。
- ベストアンサー
- C・C++・C#
- プロセスIDの取得(タスクバーのみ)
似たような質問ですがわからないことがあるので質問します。 Enumwindows関数でタスクバーにあるウインドウ(トップレベルウィンドウ)を列挙することはできましたが、そのプロセスIDを表示させることができませんでした。 別のプログラムでプロセスIDを表示させることはできましたが そのプログラムですとすべてのプロセスを表示することになるので これでは自分のやりたい事と少し違うので困っています。 どうしたらタスクバーにあるプロセスIDをとりだすことができるので しょうか? 自分では GetWindowThreadProcessId関数 EnumChildWindows関数 を使用すればいいと思ってますが、具体的なプログラムが くめていません。 どうかよろしくおねがいします。
- ベストアンサー
- C・C++・C#
- javaのプロセス起動について
UNIXで例えば以下のようなコマンドでjavaのプロセスを停止するとします。 ps -eo pid,comm | awk '$2=="java" {print "kill -9" $1}' 逆にjavaのプロセスをコマンドで起動する方法はありますか?
- ベストアンサー
- BSD系OS
- UNIX(Linuxでも)のkillコマンドで、終了メッセージを抑止し
UNIX(Linuxでも)のkillコマンドで、終了メッセージを抑止したい。 例えば、シェルの中で以下のようなコマンドがある場合に、 「○○が終了しました」とメッセージが出力されてしまいます。 抑止方法があれば教えてください。 kill xxx > /dev/null 2>&1 ※xxxはプロセスID よろしくお願いします。
- ベストアンサー
- Linux系OS
- c言語でプロセスIDを調べたい
unixのコマンドで ps aux と打つと "ユーザー名" "プロセスID" 。 。 。 。 がでますけど、この2番目の"プロセスID"を調べる関数ってありますか? ※というのも、プロセスID(ジョブ番号)を引数にして、そのプロセスが終了したら何か処理をさせるというプログラムを作りたいからです。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- javaのプロセスについて
UnixやLinuxなどで、javaのプロセスを常駐させたいのですが、何か方法はありますでしょうか。 javaという名前であれば何でもいいので、テスト的に起動したいです。 (プロセスをkillするテストをするために、使用します)
- ベストアンサー
- Linux系OS
- linuxで絶対パスからプロセスをkillの仕方
事情があって、linuxで絶対パスからプロセスをkillしようと思ったのですが、ググっても、プロセスidからkillする方法などしか出てきませんでした。 教えてください。
- ベストアンサー
- Linux系OS
- windowsのプロセスIDやスレッドIDの使い道
win32APIで取得したプロセスIDやスレッドIDの使い道について教えてください。 CreateProcessなどで取得したプロセスのハンドルやスレッドのハンドルはwin32APIで使う場面がありますが、プロセスIDやスレッドIDの使い道がわかりません。 どのような場面でプロセスIDやスレッドIDを使うのでしょうか?具体的にこんな事をするときに使うよなどあれば教えていただきたいです。 プロセスIDやスレッドIDを引数にとるAPI関数などがあれば教えていただきたいです。
- ベストアンサー
- その他(プログラミング・開発)
- PIDではなくプロセス名を指定してkillする方法
PIDではなくプロセス名を指定してkillする方法 皆さんこんにちは。 Linuxで使うkillコマンドに関して教えてほしいことがあります。 killを使う際は、 killの後ろにPIDを指定してkillを実行していましたが、 PIDではなくプロセス名を指定して、 該当するプロセスを一度に終了させる方法はあるでしょうか。 宜しくお願い致します。 OS:Fedora9
- ベストアンサー
- Linux系OS
お礼
すいませんたぶん自己解決したようです。 プロセスIDにこだわっていたので、ウインドウハンドルで終了させる ようにしてみたら意外と簡単に終了させることができました。 またお世話になるかもしれませんがどうもありがとうございました。
補足
その節はお世話になりありがとうございました。 少し補足させていただきますと今作製しようとしてるソフトは 遠隔監視(起動中のアプリケーション、メッセージを送るなど)を 複数名でやっています。自分の分担ではこのウインドウの表示、 またそのウインドウの終了をさせようとしています。 そのためクライアントからサーバ側にプロセス名、プロセスIDを 送り、サーバ側からプロセスIDをクライアントに送りアプリケーションを終了させようとしているところです。そのためTerminateProcess関数 でもよいかと思い乗せたしだいです。WM_CLOSEでは ウインドウズハンドルなのでプロセスIDでの終了を組みたいと 考えていましたので、できましたならアドバイスをお願いします。 前述したリンクのソースである程度までは推測していますが、 なにぶん実力不足のためうまく組めないのが現状です。 ちなみにソフト開発はJAVAメインとなっており私はJNIを使用し 開発しています。 どうかよろしくお願いします。