WM_ENDSESSION メッセージを傍受して、別のアプリケーションが受信できないようにすることは可能ですか?
Windows が再起動またはシャットダウンする前に追加のアクションを実行するようにそのアプリケーションに命令したいのですが、アプリケーションをそのように構成することはできません。
アプリケーションはスクリーン レコーダー ソフトウェアであり、Windows がシャットダウンするとビデオが破棄されます。それを防ぎ、ビデオを保存する必要があります。
WM_ENDSESSION メッセージを傍受して、別のアプリケーションが受信できないようにすることは可能ですか?
Windows が再起動またはシャットダウンする前に追加のアクションを実行するようにそのアプリケーションに命令したいのですが、アプリケーションをそのように構成することはできません。
アプリケーションはスクリーン レコーダー ソフトウェアであり、Windows がシャットダウンするとビデオが破棄されます。それを防ぎ、ビデオを保存する必要があります。
WM_ENDSESSION メッセージを傍受して、別のアプリケーションが受信できないようにすることは可能ですか?
技術的には、 からのメッセージ フックを使用しますSetWindowsHookEx()
。使用するフックによっては、メッセージを別のメッセージのように変更する (破棄しない) ことができます ( WM_NULL
. ただし、 の場合WM_ENDSESSION
、これは単なる通知であり、要求ではないため、アプリケーションがそのメッセージに対して何を行っても、Windows はシャットダウンを続行します。
Windows が再起動またはシャットダウンする前に、そのアプリケーションに追加のアクションを実行するように命令したいのですが、アプリケーションをそのように構成することはできません。
アプリケーションはスクリーン レコーダー ソフトウェアであり、Windows がシャットダウンするとビデオが破棄されます。それを防ぎ、ビデオを保存する必要があります。
したがって、実際には回避したくありませんWM_ENDSESSION
。アクションが最初に実行されるまで、他のアプリの処理を遅らせたいだけです。
最善の方法は、レコーダーの作成者に連絡して、システムのシャットダウン時にビデオを保存する機能の追加を依頼することです。
それを超えて、MSDN は次のように述べています。
Windows Vista でのアプリケーション シャットダウンの変更
デフォルトでは、最上位ウィンドウが表示されていないアプリケーションは、終了する前に WM_ENDSESSION を処理するために 5 秒間与えられます。
アプリケーションが WM_ENDSESSION に応答してシャットダウン処理を完了するのに 5 秒以上かかる場合は、WM_QUERYENDSESSION ハンドラーで ShutdownBlockReasonCreate() を呼び出し、シャットダウンをブロックしないようにすぐに WM_QUERYENDSESSION に TRUE を応答する必要があります。次に、WM_ENDSESSION ハンドラですべてのシャットダウン処理を実行する必要があります。
このように、Windows はアプリケーションを最上位のウィンドウが表示されているかのように扱い、WM_ENDSESSION を処理するために 30 秒を与えます。
したがって、メッセージ フックを使用してインターセプトしWM_QUERYENDSESSION
、呼び出してShutdownBlockReasonCreate()
すぐに返してから、インターセプトWM_ENDSESSION
してビデオ保存アクションを呼び出しShutdownBlockReasonDestroy()
、終了時に呼び出すことができます。もちろん、レコーダーが に応答してビデオを破棄していると仮定しWM_ENDSESSION
ますWM_QUERYENDSESSION
。
これら 2 つのメッセージが Windows でどのように処理されるかについて詳しくは、MSDN を参照してください。