C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Windowsシャットダウン・再起動・ログオフキャンセル


(過去ログ 169 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■97203 / inTopicNo.1)  Windowsシャットダウン・再起動・ログオフキャンセル
  
□投稿者/ ホエホエ (1回)-(2021/04/13(Tue) 17:52:18)

分類:[.NET 全般] 

以前には良くお世話になっていました、ホエホエです。

タイトルにも書いてますが、作成した.NETプログラムが
動作中はユーザー操作や、電源ボタン押下によって発生した
Windowsシャットダウン・再起動・ログオフをキャンセルしたいです。

プログラムでの解決方法自体は、ググれば簡単にSystemEventsの
SessionEndingにイベントハンドラを追加し、Cancelをtrueにすれば
できると言うことは見つかったのですが…

その方法では確かにシャットダウン等を阻害できるのですが
画面が真っ青になり「〇個のアプリを閉じて、シャットダウンします」の
ような画面になってしまい、その画面をキャンセル操作しないと
作成しているプログラムのフォームを操作できない課題があります。

上記の真っ青画面を出さなくする方法はありますか?
(シャットダウン操作自体のイベントは拾う必要があるため、
Windows自体の電源オプション設定による電源ボタン無効化は
解決方法としてはNGです)


ご存知の方教えてください。

環境は
 Windows10 x64
 Visual C#.NET 2010
です。
引用返信 編集キー/
■97205 / inTopicNo.2)  Re[1]: Windowsシャットダウン・再起動・ログオフキャンセル
□投稿者/ 魔界の仮面弁士 (3065回)-(2021/04/13(Tue) 19:07:47)
No97203 (ホエホエ さん) に返信
> ような画面になってしまい、その画面をキャンセル操作しないと
> 作成しているプログラムのフォームを操作できない課題があります。

残念ながら、そういう仕様です。

XP 以前では、アプリケーション都合でユーザーのシャットダウン要求が
妨げられていたため、Vista 以降ではキャンセルされた場合にも
シャットダウン UI を表示するよう、挙動が変更されました。

この仕様変更により、現在はシャットダウンを妨げるのではなく、
極力シャットダウンを素早く続行できるようにすることが求められています。

https://docs.microsoft.com/en-us/windows/win32/shutdown/shutdown-changes-for-windows-vista?WT.mc_id=DT-MVP-8907
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms700677%28v=vs.85%29?WT.mc_id=DT-MVP-8907

どうしても中断できない処理(DVD の書き込み処理など)がある場合には、
Vista 以降では、シャットダウンの阻害理由を示すために、
ShutdownBlockReasonCreate (と ShutdownBlockReasonDestroy) を用いて
短いメッセージを示すことができるようになっています。
XP のようにシャットダウン UI をスキップできるわけでは無いですけれどね。


> Windowsシャットダウン・再起動・ログオフをキャンセルしたいです。

OS 側からそれらのタイミングで、
各アプリケーションに対して終了許可を求めるために、
WM_QUERYENDSESSION メッセージが飛んでくる仕様になっています。

すべてのアプリケーションで終了が許可された後、さらに
WM_ENDSESSION メッセージが届くので、そこで実際に終了処理を行います。


WM_QUERYENDSESSION に対して、戻り値 1 を返却すると終了に同意したことになり、
5 秒以内に戻り値 0 を返却すると拒否(終了処理の遅延依頼)の意味になります。

この WM_QUERYENDSESSION メッセージの LPARAM は理由を示しており、
 0x00000000 … シャットダウン又は再起動中
あるいは、下記の組み合わせがセットされています。
 0x00000001 … CloseApp (更新プログラム用の置換時またはリソース不足)
 0x40000000 … Critical (強制的なシャットダウン)
 0x80000000 … Logoff (ログオフ)

https://docs.microsoft.com/ja-jp/windows/win32/shutdown/logging-off?WT.mc_id=DT-MVP-8907
https://docs.microsoft.com/ja-jp/windows/win32/rstmgr/guidelines-for-applications?WT.mc_id=DT-MVP-8907


> プログラムでの解決方法自体は、ググれば簡単にSystemEventsの
> SessionEndingにイベントハンドラを追加し、Cancelをtrueにすれば
> できると言うことは見つかったのですが…

SystemEvents.SessionEnding イベントは、WM_QUERYENDSESSION を
イベント化しただけのものです。終了理由である LPARAM は簡素化されているため、
0x80000000 のビットフラグが立っていれば Logoff 扱い、
それ以外はすべて SystemShutdown として扱われます。


> 「〇個のアプリを閉じて、シャットダウンします」

「○」(U+25CB) と間違えやすいですが、
「〇」(U+3007) は漢数字の零を意味するので、
これだと「0個のアプリ」という意味になってしまいますね。
引用返信 編集キー/
■97406 / inTopicNo.3)  Re[2]: Windowsシャットダウン・再起動・ログオフキャンセル
□投稿者/ ホエホエ (2回)-(2021/05/10(Mon) 11:50:59)
魔界の仮面弁士さん>
「そう言う仕様」で回避できない、と言うことで了解しました。
お礼が遅くなりましたが、ご教示ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -