Как использовать 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.
Пример кода находится на этой странице, которая также отмечает:
Сервисы не имеют петель сообщений, если им не разрешено взаимодействовать с рабочим столом. Если цикл сообщений не предоставляется скрытой формой, как в этом примере, служба должна быть запущена под локальной системной учетной записью, и для включения взаимодействия с рабочим столом требуется ручное вмешательство. То есть администратор должен вручную установить флажок Разрешить взаимодействовать с рабочим столом на вкладке Вход в систему диалогового окна свойств службы. В этом случае цикл сообщений предоставляется автоматически. Эта опция доступна только в том случае, если служба запущена под локальной системной учетной записью. Взаимодействие с рабочим столом не может быть включено программно.