0

Windowsサービスを使用して、プログラム(Notepad.exeなど)を検出して閉じたい。以下のコードは、コンソールアプリケーションで選択するのに適しています。

class Program
{
    private static SessionSwitchEventHandler sseh;
    static void Main(string[] args)
    {
        sseh = new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
        SystemEvents.SessionSwitch += sseh;
        while (true) { }
    }

    static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        Console.WriteLine(e.Reason.ToString());
    }
}

しかし、上記のコードはWindowsサービスWindows 7では機能しません。このリンクを見てください:

http://social.msdn.microsoft.com/Forums/eu/netfxcompact/thread/04b16fac-043a-41c3-add9-482c912e95be

私は、Windows 7で実行されないWindowsサービスで以下のコードを記述しました。これは、コンソールアプリケーションのWindows7で毎回動作します。

protected override void OnStart(string[] args)
{ 
    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
    Console.ReadLine();
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
}


static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
    WriteToLogFile( e.Reason.ToString());
    if (e.Reason == SessionSwitchReason.SessionLock)
    {
         WriteToLogFile("SessionLock ");
    }
    if (e.Reason == SessionSwitchReason.SessionUnlock)
    {
         WriteToLogFile("SessionUnlock ");
    }
    if (e.Reason == SessionSwitchReason.SessionLogon)
    {
         WriteToLogFile("SessionLogon ");
    }
}

この記事(http://rhauert.wordpress.com/category/ucc/)を読みましたが、使用できません

protected override void OnStart(string[] args)
{
     WriteToText("Windows Service is started");
     SessionChangeHandler x = new SessionChangeHandler();
}
4

1 に答える 1

1

MSDN:

SystemEvents.SessionSwitchイベント

このイベントは、メッセージポンプが実行されている場合にのみ発生します。Windowsサービスでは、非表示のフォームが使用されているか、メッセージポンプが手動で開始されていない限り、このイベントは発生しません。Windowsサービスで非表示のフォームを使用してシステムイベントを処理する方法を示すコード例については、SystemEventsクラスを参照してください。

コードサンプルはこのページにあり、次の点にも注意してください。

デスクトップとの対話が許可されていない限り、サービスにはメッセージループがありません。この例のように、メッセージループが非表示のフォームで提供されていない場合、サービスはローカルシステムアカウントで実行する必要があり、デスクトップとの対話を有効にするには手動による介入が必要です。つまり、管理者は、[サービスのプロパティ]ダイアログボックスの[ログオン]タブで、[サービスにデスクトップとの対話を許可する]チェックボックスを手動でオンにする必要があります。その場合、メッセージループが自動的に提供されます。このオプションは、サービスがローカルシステムアカウントで実行されている場合にのみ使用できます。デスクトップとの対話をプログラムで有効にすることはできません。

于 2012-11-15T10:23:18.000 に答える