C# - необходимо определить, вызвана ли блокировка пользователя командой Suspend - PullRequest
0 голосов
/ 06 апреля 2020

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;
            }
        }
...