TL; DR: можно ли определить, была ли блокировка вызвана командой suspend в обработчике SessionSwitch? Или я могу определить, была ли команда приостановки инициирована разблокированным пользователем в обработчике PowerModeChanged?
Есть часть программы, которую я сейчас пишу, которая выполняет определенные важные действия, когда пользователь Windows заблокирован или разблокирован , Мне нужна программа, чтобы НЕ выполнять эти действия, если пользователь приостанавливает работу компьютера, когда он разблокирован. Проблема заключается в том, что приостановка компьютера вызывает SessionSwitch (блокировка), прежде чем он запускает PowerModeChanged (приостановить). Я бы вообще не хотел выполнять свои действия по блокировке, если блокировка была инициирована командой suspend. Кроме того, для меня допустимо (хотя и не желательно) отменить действия, предпринятые, если мой PowerModeChanged определяет, что приостановка была заказана до того, как произошла блокировка. В основном мои два способа обработки этого, кажется, либо в обработчике SessionSwitch, либо в обработчике PowerModeChanged - предпочтительно, первом - но я не вижу способа сделать это. Можно ли что-то из этого сделать?
Чтобы уточнить, в моем сценарии использования необходимо различать пользователя, который приостанавливает работу компьютера, когда он разблокирован, и пользователя, который приостанавливает работу компьютера с экрана блокировки. Приостановка во время разблокировки должна привести к предотвращению обнаружения моего «заблокированного пользователем» кода, в то время как приостановка из экрана блокировки должна продолжаться
Вот урезанная версия моих двух обработчиков:
private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
// Only check if locked if program marked as Running
if (Running)
{
if (e.Reason == SessionSwitchReason.SessionLock)
{
// If locked because of suspend, do NOT do things
// Do things if user becomes locked normally
}
else if (e.Reason == SessionSwitchReason.SessionUnlock)
{
// Do things if user becomes unlocked
}
}
}
private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
PowerModes powerMode = e.Mode;
// If user sleeps the computer while program in Running mode, stop Running mode
// Purpose is to "prevent" program from detecting future lock events (among other things)
if (Running && powerMode == PowerModes.Suspend)
{
// if (suspend issued while user logged in...)
// Undo SessionSwitch lock actions taken?
// Running = false;
// if (suspend issued from lock screen...)
// Ignore suspend command; keep running like normal
}
// Resume program running if return from suspend after Running stopped
else if (!Running && powerMode == PowerModes.Resume)
{
Running = true;
}
}