8

私はこの MFC プログラムを持っています。タスク マネージャーで強制終了すると、プログラムで例外が発生し、クラッシュします。

プロセスを強制終了し、プログラムを正常に終了するときに、タスク マネージャーからイベントを取得したいと考えています。

プロセスを強制終了するためにタスク マネージャーが使用している方法はほとんどないことを理解しています。

1) [アプリケーション] タブから、アプリケーションのメインの表示ウィンドウに WM_CLOSE メッセージを送信していると誰かに言われました。数秒経ってもアプリケーションがダウンしない場合、タスク マネージャーは応答していないと検出し、その上で TerminateProcess() を使用します。処理する。

2) [プロセス] タブから、TerminateProcess() Windows API を使用していると誰かに言われました。

タスクマネージャーが使用している他の方法はありますか?

最後の2つの方法について私は正しいですか?

前もって感謝します。

4

4 に答える 4

8

はい、どちらも正しいです。正常に閉じるには、WM_CLOSE に応答する必要があります。これは、タスク マネージャー (シャットダウンなど) だけでなく、どこからでも発生する可能性があります。

MFC は通常、WM_CLOSE を処理します。アプリが応答しない場合は、メイン スレッドが別の処理を行っているか、説明から WM_CLOSE ハンドラのどこかでクラッシュしている可能性があります。

アプリをデバッグして、例外が発生している場所を見つけることができますか?

于 2012-02-28T08:47:20.783 に答える
3

はい、これらはオプションです。

CTRL_CLOSE_EVENT完全を期すために、「タスクの終了」ボタンがクリックされたときに、コンソール モード アプリケーションが応答可能な送信を取得することに注意してください。

を傍受したり、反応したりすることはできないことに注意してくださいTerminateProcess。あなたのプロセスは死んでしまい、それが起こる前にあなたができることは何もありません。実際、できたらかなり悪いでしょう。その場合、混乱したプロセスを終了する方法がないためです。

于 2012-02-28T08:55:40.630 に答える
2

タスクマネージャは内部でEndTask関数を使用します。この関数は、WM_CLOSEメッセージをアプリケーションに送信します。アプリケーションがそのメッセージに応答せず、ユーザーがアプリケーションを強制終了する場合、TerminateProcessがプロセスで呼び出されます。

于 2012-02-28T12:42:52.283 に答える
1

WM_CLOSE を取得すると、それを簡単に検出できるため、アプリケーションはそれに基づいて動作できます。

アプリケーションを強制終了するために がいつ呼び出されているかを知ることはできないとTerminateProcess思います。TerminateProcessドキュメントには、ターゲット プロセスの即時かつ無条件のシャットダウンであると記載されています。

(これをどれだけ達成したいかによっては、Windows API へのフックに関するこのリンクを参照してください。ただし、簡単であるとは思わないでください。)

于 2012-02-28T08:54:22.407 に答える