Как использовать WtsApi32.dll в блокировке / разблокировке обработчик сессии в службе Windows?

Я хочу обнаружить и закрыть любую программу (например: Notepad.exe) с помощью службы Windows. Ниже код хорошо выбрать в консольном приложении.

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 7. Windows, посмотрите эту ссылку:

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

Я написал ниже код в службе Windows, которая не работает на Win 7, она работает каждый раз на Windows 7 в консольном приложении.

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();
}

1 ответ

Решение

MSDN:

Событие SystemEvents.SessionSwitch:

Это событие возникает, только если работает насос сообщений. В службе Windows, если не используется скрытая форма или насос сообщений запущен вручную, это событие не будет вызываться. Пример кода, который показывает, как обрабатывать системные события с помощью скрытой формы в службе Windows, см. В классе SystemEvents.

Пример кода находится на этой странице, которая также отмечает:

Сервисы не имеют петель сообщений, если им не разрешено взаимодействовать с рабочим столом. Если цикл сообщений не предоставляется скрытой формой, как в этом примере, служба должна быть запущена под локальной системной учетной записью, и для включения взаимодействия с рабочим столом требуется ручное вмешательство. То есть администратор должен вручную установить флажок Разрешить взаимодействовать с рабочим столом на вкладке Вход в систему диалогового окна свойств службы. В этом случае цикл сообщений предоставляется автоматически. Эта опция доступна только в том случае, если служба запущена под локальной системной учетной записью. Взаимодействие с рабочим столом не может быть включено программно.

Другие вопросы по тегам