2016-11-15 5 views
0

シャットダウン中にアプリケーションが長いタスクを実行することがあります。したがって、結果値0のWM_QUERYENDSESSIONを処理してシャットダウンを拒否し、ShutdownBlockReasonCreateを使用して、アプリケーションがシャットダウンを防止したときにWindowsが表示する黒いシャットダウン待機画面で意味のあるメッセージを表示します。Windows 10 - ShutdownBlockReasonCreateを実行すると、1分後にシャットダウンがキャンセルされます

ただし、Windows 10以降、この黒い画面は1分間表示されます。その後、シャットダウンはキャンセルされ、ユーザーはデスクトップに戻ります。これはなぜですか?また、Windows 7のように、黒画面の寿命を無期限に延ばすことはできますか?すべてのシャットダウンブロックの理由が破棄されるまで、黒い画面が表示されます。

答えて

0

長時間実行されるタスクは、シャットダウンが開始されるまでにシャットダウンをブロックすることを意味します。は、シャットダウンが開始されます。シャットダウンによって中断したくないタスクがある場合、タスクは最初にShutdownBlockReasonCreate()を呼び出す必要があり、終了するとShutdownBlockReasonDestroy()を呼び出す必要があります。ユーザーはまだシャットダウンを強制することができます。

シャットダウンが一度開始されると、シャットダウンはブロックされず、シャットダウンを強制するためにOSが介入するまで短時間だけ延長することができます。あなたがそれを避けることができる場合、シャットダウンは開始する悪い時です新しい長期的なタスクです。

は、詳細については、MSDNを参照してください。

Application Shutdown Changes in Windows Vista

Changes to power management in Windows Vista

Now that Windows makes it harder for your program to block shutdown, how do you block shutdown?

非常に少なくとも、あなたがシャットダウン時にタスクを実行するために、時間の長い期間を必要とする場合、 WM_QUERYENDESSIONを受け取ったらShutdownBlockReasonCreate()に電話し、シャットダウンを続行するためにTRUEを返してから、を受け取ったらタスクを実行する必要があります10。 WM_QUERYENDESSIONを数秒以上ブロックしないでください。そうしないと、Windowsが介入してアプリをすぐに終了させる可能性が高くなります。

これは、アプリケーションがTRUEに応答した後にシャットダウンが実際に進まない可能性があるため、WM_QUERYENDSESSIONでも重要です。 WM_QUERYENDSESSIONが送信されると、Windowsはシャットダウンの許可をアプリケーションに要求しています(またはシャットダウンが強制されることを伝える)が、実際にシャットダウンしていません。あなたのアプリがWM_ENDSESSIONを受け取ると、シャットダウンが実際に実行されていること(そしてその理由)が分かります。この流れはまた、MSDNで説明されています

Shutdown Changes for Windows Vista

Restart Manager | Guidelines for Applications

あなたがこれらのガイドラインに従っている場合でも、Windowsはまだあなたが無期限にシャットダウンをブロックできるようにするつもりはありません。それはあなたに30秒、1分などの余分な時間を与えるかもしれません。あなたのアプリのシャットダウンロジックはできるだけ速くなければなりません。もしそうなら、シャットダウンロジックを再設計してスピードアップしなければなりません。

+0

多くの感謝!私は何ができるかを確認します。ユースケースは、顧客がシャットダウン時にバックアップジョブを実行することです。彼らが取る時間は変わるかもしれません。シャットダウンでアプリケーションを起動させるのではなく、アプリケーションがシャットダウンを呼び出させることをお勧めします。 – superflexible

関連する問題