Windowsのシャットダウン時にアプリケーションに問題があります。アプリが正常に終了せず、[タスクの終了]ウィンドウが表示されます。デバッガーを使用して何が起こっているかを確認するにはどうすればよいですか?
Windowsシャットダウンメッセージをアプリケーションに送信して、Windowsがシャットダウンしていると見なし、その動作を正確に確認する方法はありますか?
MicrosoftのWindows用ロゴテストツールにはRestartManager(rmtool.exe)という名前のツールがあり、これを使用してシャットダウンおよび再起動メッセージをプロセスに送信できます。ロゴテストツールはここからダウンロードできます:
http://download.Microsoft.com/download/d/2/5/d2522ce4-a441-459d-8302-be8f3321823c/LogoToolsv1.0.msi
次に、プロセスのシャットダウンをシミュレートできます。
rmtool.exe -p [PID] -S
ここで、[PID]はプロセスIDです。 Vistaロゴ認定テストケースドキュメントによると、
リスタートマネージャのシャットダウンメッセージは次のとおりです。
a。 LPARAM = ENDSESSION_CLOSEAPP(0x1)のWM_QUERYENDSESSION:GUIアプリケーションは、再起動の準備をするためにすぐに応答(TRUE)する必要があります。
b。 LPARAM = ENDSESSION_CLOSEAPP(0x1)のWM_ENDSESSION:アプリケーションは5秒以内(サービスの場合は20秒)にシャットダウンする必要があります。
c。 CTRL_SHUTDOWN_EVENT:コンソールアプリケーションはすぐにシャットダウンする必要があります。
Windowsがシャットダウンすると、すべてのアプリケーションに「WM_QueryEndSession」が送信されると思います。 Windowsのシャットダウンをシミュレートするために、このメッセージを使用してアプリケーションにPostMessageを実行する小さなアプリケーションを作成し、何が起こるかを確認できます。 Windowsは、実際にアプリケーションを閉じるためにそれよりも多くのメッセージを送信する場合があります(WM_CLOSEなど)が、アプリケーションが「WM_QueryEndSession」メッセージを受信するたびに、アプリケーションがその下からラグを引き出そうとしていることを意味します。
SystemEvents.SessionEnding イベントを使用できます。このイベントは、ユーザーがログオフまたはシャットダウンしたときに発生します。ただし、使用するときは注意してください。一部のリソースは、使用可能であることが保証されていません。たとえば、私のアプリケーションは、シャットダウン時にサーバーにアクセスしてユーザーをクロックアウトする必要がありましたが(タイムレコーダーアプリケーション)、このイベントが発生したときにネットワークカードがすでに無効になっている場合があります。クリーンアップを行っているだけなので、これは問題なく機能するはずです。
SendMessage を使用して、任意のパラメータを含むウィンドウメッセージをウィンドウに送信できます。
デバッグとテストに非常に役立ちます。
メッセージを送信するWM_QUERYENDSESSION
with LPARAM
= ENDSESSION_CLOSEAPP
。アプリケーションは、シャットダウンして再起動する準備ができていることを示すために1(TRUE)を返す必要があります。
メッセージを送信するWM_ENDSESSION
LPARAM = ENDSESSION_CLOSEAPP
アプリケーションは指定されたタイムアウト期間内にシャットダウンする必要があります。