Как узнать, заблокирован ли экран windows или нет в приложении Universal Windows (UWP). Есть ли какой-либо API или способ? - PullRequest
0 голосов
/ 14 апреля 2020

Аналогичный вопрос

и другой пример: это решение работает для uwp? Или это только для настольных приложений

"Приложение также приостанавливается, когда экран блокировки появляется, пока нет расширенного сеанса выполнения, и в этом приложении активен c.

Когда приложение приостанавливается, оно вызывает событие Application.Suspending. Шаблоны проектов Visual Studio UWP предоставляют обработчик для этого события с именем OnSuspending в App.xaml.cs. До Windows 10, версия 1607, вы должны поместить код чтобы сохранить ваше состояние здесь. Теперь рекомендуется сохранить ваше состояние при входе в фоновое состояние, как описано выше. "

Согласно microsoft docs , когда появляется экран блокировки, приложение переходит к «OnSuspending ()» в App.xaml.cs.

Так что я думаю, что любой код, который мы пишем, чтобы проверить, заблокирован экран или нет, должен быть записан в «OnSuspending ()».

как это можно использовать для решения нашей проблемы?

1 Ответ

0 голосов
/ 15 апреля 2020

К сожалению, ни один такой API на платформе UWP не может использоваться для обнаружения заблокированного экрана. После проверки ссылки на упомянутые случаи, я думаю, что вы можете использовать расширение рабочего стола для подхода, и основная теория заключается в том, чтобы прослушивать поведение блокировки экрана по событию SystemEvents.SessionSwitch в расширении рабочего стола и отправлять сообщение о флаге клиенту UWP с AppSerivce. И у меня есть пример кода для вас, пожалуйста, проверьте эту ссылку . Этот пример кода сделан на основе блога @ Stefan. Для более подробной информации, пожалуйста, ищите Глобальная регистрация горячих клавиш в блоге UWP .

class LockScreenAppContext : ApplicationContext
{

    private Process process = null;
    private bool LockScreenInProgress = false;

    public LockScreenAppContext()
    {
        int processId = (int)ApplicationData.Current.LocalSettings.Values["processId"];
        process = Process.GetProcessById(processId);
        process.EnableRaisingEvents = true;
        process.Exited += DesktopExtensionAppContext_Exited;
        SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

    }

    private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        switch (e.Reason)
        {

            case SessionSwitchReason.SessionLock:
                SentMessage(true);
                break;
            case SessionSwitchReason.SessionUnlock:
                SentMessage(false);
                break;
        }
    }

    private async void SentMessage(bool isLocked)
    {
        ValueSet ScreebLocked = new ValueSet();
        ScreebLocked.Add("Lock", isLocked);

        AppServiceConnection connection = new AppServiceConnection();
        connection.PackageFamilyName = Package.Current.Id.FamilyName;
        connection.AppServiceName = "LockScreenConnection";
        AppServiceConnectionStatus status = await connection.OpenAsync();
        if (status != AppServiceConnectionStatus.Success)
        {
            Debug.WriteLine(status);
            Application.Exit();
        }
        connection.ServiceClosed += Connection_ServiceClosed;
        AppServiceResponse response = await connection.SendMessageAsync(ScreebLocked);
    }

    private void DesktopExtensionAppContext_Exited(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void Connection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args)
    {
        Debug.WriteLine("Connection_ServiceClosed");
        LockScreenInProgress = false;
    }

}
...