Windowsサービスでログオフを知るには – プログラミング – Home

Windowsサービスでログオフを知る...
 
通知
すべてクリア

[解決済] Windowsサービスでログオフを知るには


中山
 中山
(@中山)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

WindowsXPで動かしてるアプリでログオフしようとしてるのを知りたいとき、
WM_QUERYENDSESSIONメッセージが来るのでわかるのですが、
アプリケーションではなくWindowsサービスだと飛んできません。
サービスのプロパティで「デスクトップとの対話をサービスに許可」をチェック
入れてもだめでした。

このさい、WM_QUERYENDSESSIONじゃなくてもいいんで、
Windowsサービスでログオフしようとしていることを知るイベントやAPIは無いでしょうか?

開発環境:VisualStudio2008 MFCは現在は使ってません
実行環境:WindowsXP


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

HandlerEx で SERVICE_CONTROL_SESSIONCHANGE を捕まえてください。
http://msdn.microsoft.com/en-us/library/ms683241.aspx


返信引用
中山
 中山
(@中山)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

遅くなりました。

Vista上のVirtualPCで試してみました。が、SERVICE_CONTROL_SESSIONCHANGEが飛んでき
ませんでした。

なぜだ?と思い調べたところ、SERVICE_CONTROL_SESSIONCHANGEはXP以降じゃないと飛ば
ないんですね。
VirtualPCのOSはWindows2000でした。

後出しの情報で申し訳ないのですが、実行環境にWindows2000のマシンもいくつかあるん
です。
XPと2000でそんなに違わないだろうとタカをくくってました。申し訳ありません。

Windows2000でSERVICE_CONTROL_SESSIONCHANGE相当のイベント等はありませんでしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

むー。

Winlogon Notification Package かなぁ。
http://msdn.microsoft.com/en-us/library/aa380545.aspx

ただ、こいつはサービスに直接通知をくれるわけじゃないので、何らかの手段でサービス
と通信しなければなりませんが。

あと、Vista 以降では使えないらしいので、Vista 以降用には何か別の手段を。
http://technet.microsoft.com/ja-jp/library/cc721961.aspx


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

上記の TechNet のページにもありますが、SENS とやらを使うと、2000 でも Vista でも
同じ仕組みでいけそうですね。
http://msdn.microsoft.com/en-us/library/aa376860.aspx

ただ、COM+ イベントシステムとやらを使うようで、登録がちょーっと面倒くさそうです
けど。


返信引用
中山
 中山
(@中山)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

aetosさんありがとうございます。

Winlogon通知パッケージを使おうと思います。
DLLを作成して、取りたいイベントのみレジストリに登録し、
DLLからサービスに、パイプなりソケットなりで通知しようと思います。

Win2kとXPのみがターゲットなので、構成はこれでいけると思っているのですが、
なぜかレジストリに登録したのにイベントが通知されず四苦八苦してます。
テストアプリケーションでDLLの関数を、LoadLibrary()、GetProcAddress()で
呼べるのは確認したので、DLLではなくおそらく設定の方のミスだと思っています。
(これは別質問にした方がいいですかね)


返信引用
中山
 中山
(@中山)
ゲスト
結合: 16年前
投稿: 1
 

Winlogon Notification Packageで望みどおり動作しました。
動いていなかった原因は、レジストリにイベントやDLL名を登録したあとに
再起動が必要だったっていうことと、
DllNameにフルパスで任意の場所を書くのはダメで、system32の下におかないと
動かないということでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました