- ベストアンサー
WINのタスクマネージャの強制終了
Windowsのプロセス関連のAPIを勉強中です。 タスクマネージャでアプリケーションを強制終了させようとすると、正常終了できるときはしようとしますよねぇ。 これはAPIのTerminateProcessでは決してできなそうなのですが、アプリケーションに正常終了を促すのはどうやればよろしいんでしょうか。 自分であれこれ考えた結果、CreateRemoteProcessでExitProcessを実行するスレッドを、対象のプロセスに植え付けるぐらいしか思いつかなかったのですが、これは正しいんでしょうか(試してません)。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。itohhといいます。 >プロセスIDからウィンドウのハンドルを得る方法がわからないのですが、 >どうしたらよいでしょう。 自分でCreateProcessしたときに取得したプロセスIDでしょうか? それですと簡単です。 ちょっと時間がないので、参考になるサイトを載せておきますのでそちらをご覧になってください。 ・Visual C TechTips URL:http://techtips.belution.com/ja/vc/ ・新しいプロセスを作成し、そのプロセスが作成したウィンドウハンドルを取得するには? URL:http://techtips.belution.com/ja/vc/0024/
その他の回答 (2)
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 VBアプリケーションでもWM_CLOSEメッセージはOKだと思いますよ。 もしかしたら、WM_DESTROYメッセージかもしれませんが。 ウィンドウを持たないアプリケーションについては、難しいですね。 アプリケーションがどういった状態で待ちに入っているか判らないわけですよね? (メッセージ待ちなのか、ロックオブジェクトで待っているのか、sleepで待っているのか...) ご自身で作成するアプリケーションならば、 ロックオブジェクトで待っていてSetEventなどで終了を通知されるまで待つ という方法もあるとは思います。
お礼
そっか、VBがWM_CLOSEを受け取れなかったら、ログオフ時に正常終了できるはずがありませんよね。 そうすると、プロセスIDからウィンドウのハンドルを得る方法がわからないのですが、どうしたらよいでしょう。 VCのウィンドウプログラミングはしたことがないので。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 >タスクマネージャでアプリケーションを強制終了させようとすると、 >正常終了できるときはしようとしますよねぇ。 これは、メッセージを受け付けることが出来る状態だからですよね。 WM_CLOSEメッセージを投げるというのはどうでしょうか? WindowsプログラムならWM_CLOSEメッセージを受け取る処理は組み込まれていて 当たり前と思うのですが。
お礼
それだと、ウィンドウを持っていないアプリケーションやVBアプリケーションに対応できないと思ったので、甘いと思ったのです。 もちろんExitProcessはVBでは正常終了しませんが。 コンソールアプリケーションはやはり正常終了されるのはムリでしょうか?
お礼
EnumThreadWindowsですね。 Get~とかQuerry~とかばっか調べてて、Enumまでは気が付きませんでした。 プロセスが持ってるスレッドのIDはわかるので、これはかなり利用できそうです。 ありがとうございました。