2

ユーザーのログオンまたはロック解除イベントが発生するたびにいくつかのアクションを実行する必要がある C# .NET 3.5 Windows サービスを作成しています。イベント ハンドラーを Microsoft.Win32.SystemEvents.SessionSwitch に追加して、サービスの登録を試みました。

using Microsoft.Win32;

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
    if (e.Reason == SessionSwitchReason.SessionLogon)
    { 
        //  Do Task
    }
    else if (e.Reason == SessionSwitchReason.SessionUnlock)
    { 
        //  Do Task
    }
}

また、クラスOnSessionChange(SessionChangeDescription changeDescription) {...}によって継承されたメソッドをオーバーライドしようとしました:ServiceBase

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    if (changeDescription.Reason == SessionChangeReason.SessionLogon)
    {
        //  Do Task
    }
    else if (changeDescription.Reason == SessionChangeReason.SessionUnlock)
    {
        //  Do Task
    }

    base.OnSessionChange(changeDescription);
}

多くのセッション イベントは、説明したいずれかの方法で処理されますが、残念ながら、これらの方法はいずれも、ユーザーの簡易切り替えやターミナル サービスが停止して無効になっている場合のセッション ロック解除のイベントを処理しません。ただし、両方のサービスが有効で実行中の場合は、イベントが処理されます。これが展開される作業環境では、サービスが有効になりません。

C# .NET マネージド コード環境内でこれを達成する別の方法はありますか? 私が見た多くの質問は、上記の方法で質問に答えます。それらは正しく機能しますが、ユーザーの簡易切り替えとターミナル サービスの両方が無効になっている場合は機能しません。

4

2 に答える 2

0

CanHandleSessionChangeEventプロパティはデフォルトでに設定されFalseています。

コンポーネントを初期化するときに次のコードを挿入します

public Service1()
        {
            InitializeComponent();
            this.CanHandleSessionChangeEvent = true;
            this.CanHandlePowerEvent = true;
            this.CanPauseAndContinue = true;
            this.CanShutdown = true;
            this.CanStop = true;
            this.AutoLog = true;
        }
于 2012-02-03T13:34:16.250 に答える