はじめまして、Haruといいます。
WindowsServer2003上で動作するアプリケーションにおいて、
ログオフなどが要求された場合に、メモ帳などを開いていて、
キャンセルするとセッション終了処理が中断されます
WindowsNT系OSでは、WM_QUERYENDSESSIONの戻り値が
アプリケーション毎に処理されてWM_ENDSESSIONに送られているようで、
他のアプリケーションによるセッション終了の中断を
検出が出来ないようなのですが、中断を検出する方法は
サービスにする以外にNT系では無いのでしょうか?
現在はセッション終了がキャンセルされた場合は、
自分のアプリケーションは終了してしまいます。
何か情報をお持ちの方、
または、参考資料やサイトなどがあれば、
ご教授頂ければと思います。
詳しくはないけど、WM_QUERYENDSESSIONが送られてきたときにFALSEを返すと、そこで止
まらない?
>関係者以外ウンウンさん
返信ありがとうございます。
少し言葉足らずだったようで、
WM_QUERYENDSESSIONの動作については
ある程度理解しているつもりで、
Win9xとWinNTで動作が違い、NT系ではWM_QUERYENDSESSIONで
FALSEを返すとそれ以降の、アプリケーションについて
WM_QUERYENDSESSIONを送らないようなのですが、
自分以外のアプリケーションがWM_QUERYENDSESSIONに対してFALSEを
返す場合のセッション終了中断を検出する方法が知りたかったのです。
Win9xでは
WM_QUERYENDSESSION → 全アプリケーションに送る
WM_QUERYENDSESSIONがどれか1つでもFALSEで返されると
WM_ENDSESSIONで全アプリケーションに中断が通知される。
WinNTでは
WM_QUERYENDSESSION → 全アプリケーションに順に送る
WM_QUERYENDSESSIONがFALSEで返された場合それ以降の
アプリケーションにWM_QUERYENDSESSIONを送らない。
WM_ENDSESSIONでは自身がWM_QUERYENDSESSIONで返した結果が通知される。
このような状態で、WinNTの場合他のアプリケーションが中断した場合に
その方法があるのかどうかが判ればと思って質問しました。
#最終的にはサービスにするしか無いかも、とも思っていますが、
#現在は常駐アプリケーションで実装されています。
他のアプリ(例えばメモ帳)がシャットダウンをキャンセルする前に、自アプリが
WM_ENDSESSION を受信してしまった場合、本当にシャットダウンされるのかキャンセルさ
れるのかが判別できないからどうしよう? ってことですよね。
SetProcessShutdownParameters という API で通知を遅らせることはできますが、お望み
にかないますでしょうか?
# 的外れなら指摘お願いします。
ググる限りでは以下のURLが参考になるような気がします。といっても、
Haruさんが行おうとしていることは、以下のを見る限り非常に困難を
極めるような気がします。
(英語苦手なので解釈が間違ってるカモしれませんが)
>> (略) - can you tell when shutdown has been cancelled?
> http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2016308&SiteID=1
情報ありがとうございます。
>シャノンさん
仰るとおりです。
SetProcessShutdownParametersについてWM_QUERYENDSESSIONの通知は
アプリケーションの起動順序に依存しているものと思っていましたが、
設定可能なのですね。。。ただ、いずれにしても他に起動されるアプリが
同じ優先順位で動作している場合の順序は保証されていないようなので、
他のアプリより終了を高確率で後にすることができるが、
確実では無いということですね。。。;
#実際他のアプリでこれを設定しているものが
#あるかどうかの問題ということになりそうですが。。。^^;
今回はSetProcessShutdownParametersによる
WM_QUERYENDSESSIONの遅延通知で試みてみようと思います。
>玲音 (st.lain) さん
参考のMSDN-BBS拝見しました。
こちらの質問は、セッション終了時に終了されたアプリを
終了がキャンセルされた場合に再度、起動させるようにしたが
出来ない為という理由のようですが、やりたいこととしては、
私の趣旨と同じだと思います。
ただ、やはり確定した方法は無く、アプリケーションへの通知を
遅延させるなどの方法が紹介されているようです。
やはり、これを確実に行うにはサービスにするしか無いようですね;
上の通り今回はシャノンさんに紹介頂いたAPIで試してみようと思います。
ありがとうございました。