• ベストアンサー

WINのタスクマネージャの強制終了

Windowsのプロセス関連のAPIを勉強中です。 タスクマネージャでアプリケーションを強制終了させようとすると、正常終了できるときはしようとしますよねぇ。 これはAPIのTerminateProcessでは決してできなそうなのですが、アプリケーションに正常終了を促すのはどうやればよろしいんでしょうか。 自分であれこれ考えた結果、CreateRemoteProcessでExitProcessを実行するスレッドを、対象のプロセスに植え付けるぐらいしか思いつかなかったのですが、これは正しいんでしょうか(試してません)。

質問者が選んだベストアンサー

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。itohhといいます。 >プロセスIDからウィンドウのハンドルを得る方法がわからないのですが、 >どうしたらよいでしょう。 自分でCreateProcessしたときに取得したプロセスIDでしょうか? それですと簡単です。 ちょっと時間がないので、参考になるサイトを載せておきますのでそちらをご覧になってください。 ・Visual C TechTips URL:http://techtips.belution.com/ja/vc/ ・新しいプロセスを作成し、そのプロセスが作成したウィンドウハンドルを取得するには? URL:http://techtips.belution.com/ja/vc/0024/

haporun
質問者

お礼

EnumThreadWindowsですね。 Get~とかQuerry~とかばっか調べてて、Enumまでは気が付きませんでした。 プロセスが持ってるスレッドのIDはわかるので、これはかなり利用できそうです。 ありがとうございました。

その他の回答 (2)

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 VBアプリケーションでもWM_CLOSEメッセージはOKだと思いますよ。 もしかしたら、WM_DESTROYメッセージかもしれませんが。 ウィンドウを持たないアプリケーションについては、難しいですね。 アプリケーションがどういった状態で待ちに入っているか判らないわけですよね? (メッセージ待ちなのか、ロックオブジェクトで待っているのか、sleepで待っているのか...) ご自身で作成するアプリケーションならば、 ロックオブジェクトで待っていてSetEventなどで終了を通知されるまで待つ という方法もあるとは思います。

haporun
質問者

お礼

そっか、VBがWM_CLOSEを受け取れなかったら、ログオフ時に正常終了できるはずがありませんよね。 そうすると、プロセスIDからウィンドウのハンドルを得る方法がわからないのですが、どうしたらよいでしょう。 VCのウィンドウプログラミングはしたことがないので。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.1

こんにちは。itohhといいます。 >タスクマネージャでアプリケーションを強制終了させようとすると、 >正常終了できるときはしようとしますよねぇ。 これは、メッセージを受け付けることが出来る状態だからですよね。 WM_CLOSEメッセージを投げるというのはどうでしょうか? WindowsプログラムならWM_CLOSEメッセージを受け取る処理は組み込まれていて 当たり前と思うのですが。

haporun
質問者

お礼

それだと、ウィンドウを持っていないアプリケーションやVBアプリケーションに対応できないと思ったので、甘いと思ったのです。 もちろんExitProcessはVBでは正常終了しませんが。 コンソールアプリケーションはやはり正常終了されるのはムリでしょうか?

関連するQ&A

専門家に質問してみよう