Я знаю, что поднимаю это из мертвых, но я нашел это полезным и надеюсь добавить немного в тему.Я внедряю дуплексную библиотеку WCF, размещенную в службе Windows, и натолкнулся на этот поток, потому что мне нужно было определить из службы Windows, когда пользователь выходит из системы или выключает компьютер.Я использую .Net Framework 4.6.1 в Windows 7 и Windows 10. Как и ранее предлагалось для завершения работы, то, что для меня работало, было переопределено ServiceBase.OnShutdown()
примерно так:
protected override void OnShutdown()
{
//Your code here
//Don't forget to call ServiceBase OnShutdown()
base.OnShutdown();
}
Не забудьте добавить следующее к вашемуКонструктор службы, позволяющий перехватывать событие завершения работы:
CanShutdown = true;
Затем для захвата, когда пользователь выходит из системы, блокирует экран, переключает пользователя и т. д., вы можете просто переопределить метод OnSessionChange
следующим образом:
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
if (changeDescription.Reason == SessionChangeReason.SessionLogoff)
{
//Your code here...
//I called a static method in my WCF inbound interface class to do stuff...
}
//Don't forget to call ServiceBase OnSessionChange()
base.OnSessionChange(changeDescription);
}
И, конечно, не забудьте добавить следующее в конструктор вашего сервиса, чтобы разрешить перехват событий изменения сеанса:
CanHandleSessionChangeEvent = true;