WindowsXPで動かしてるアプリでログオフしようとしてるのを知りたいとき、
WM_QUERYENDSESSIONメッセージが来るのでわかるのですが、
アプリケーションではなくWindowsサービスだと飛んできません。
サービスのプロパティで「デスクトップとの対話をサービスに許可」をチェック
入れてもだめでした。
このさい、WM_QUERYENDSESSIONじゃなくてもいいんで、
Windowsサービスでログオフしようとしていることを知るイベントやAPIは無いでしょうか?
開発環境:VisualStudio2008 MFCは現在は使ってません
実行環境:WindowsXP
HandlerEx で SERVICE_CONTROL_SESSIONCHANGE を捕まえてください。
http://msdn.microsoft.com/en-us/library/ms683241.aspx
遅くなりました。
Vista上のVirtualPCで試してみました。が、SERVICE_CONTROL_SESSIONCHANGEが飛んでき
ませんでした。
なぜだ?と思い調べたところ、SERVICE_CONTROL_SESSIONCHANGEはXP以降じゃないと飛ば
ないんですね。
VirtualPCのOSはWindows2000でした。
後出しの情報で申し訳ないのですが、実行環境にWindows2000のマシンもいくつかあるん
です。
XPと2000でそんなに違わないだろうとタカをくくってました。申し訳ありません。
Windows2000でSERVICE_CONTROL_SESSIONCHANGE相当のイベント等はありませんでしょうか?
むー。
Winlogon Notification Package かなぁ。
http://msdn.microsoft.com/en-us/library/aa380545.aspx
ただ、こいつはサービスに直接通知をくれるわけじゃないので、何らかの手段でサービス
と通信しなければなりませんが。
あと、Vista 以降では使えないらしいので、Vista 以降用には何か別の手段を。
http://technet.microsoft.com/ja-jp/library/cc721961.aspx
上記の TechNet のページにもありますが、SENS とやらを使うと、2000 でも Vista でも
同じ仕組みでいけそうですね。
http://msdn.microsoft.com/en-us/library/aa376860.aspx
ただ、COM+ イベントシステムとやらを使うようで、登録がちょーっと面倒くさそうです
けど。
aetosさんありがとうございます。
Winlogon通知パッケージを使おうと思います。
DLLを作成して、取りたいイベントのみレジストリに登録し、
DLLからサービスに、パイプなりソケットなりで通知しようと思います。
Win2kとXPのみがターゲットなので、構成はこれでいけると思っているのですが、
なぜかレジストリに登録したのにイベントが通知されず四苦八苦してます。
テストアプリケーションでDLLの関数を、LoadLibrary()、GetProcAddress()で
呼べるのは確認したので、DLLではなくおそらく設定の方のミスだと思っています。
(これは別質問にした方がいいですかね)
Winlogon Notification Packageで望みどおり動作しました。
動いていなかった原因は、レジストリにイベントやDLL名を登録したあとに
再起動が必要だったっていうことと、
DllNameにフルパスで任意の場所を書くのはダメで、system32の下におかないと
動かないということでした。