Средства чтения с экрана и аппаратные системные кнопки

Средства чтения с экрана, такие как экранный диктор, должны иметь возможность распознавать и обрабатывать события кнопок аппаратной системы и сообщать о своем состоянии пользователям. В некоторых случаях средство чтения с экрана может потребоваться обработать эти события аппаратной кнопки исключительно и не позволить им пузырьки до других обработчиков.

Начиная с Windows 10 версии 2004, приложения UWP могут прослушивать события аппаратной системы Fn так же, как и другие аппаратные кнопки. Ранее эта системная кнопка действовала только в качестве модификатора того, как другие аппаратные кнопки сообщили о своих событиях и состоянии.

Примечание.

Поддержка кнопки Fn зависит от изготовителя оборудования и может включать такие функции, как возможность переключения или блокировки (vs. сочетание клавиш с нажатием и удержанием), а также соответствующего индикатора блокировки (что не может быть полезно пользователям, которые слепы или имеют нарушения зрения).

События кнопки Fn предоставляются с помощью нового класса SystemButtonEventController в пространстве имен Windows.UI.Input . Объект SystemButtonEventController поддерживает следующие события:

Важно!

SystemButtonEventController не может получать эти события, если они уже обработаны обработчиком с более высоким приоритетом.

Примеры

В следующих примерах показано, как создать SystemButtonEventController на основе диспетчера и обрабатывать четыре события, поддерживаемые этим объектом.

При нажатии кнопки Fn часто возникает несколько поддерживаемых событий. Например, нажатие кнопки Fn на клавиатуре Surface запускает SystemFunctionButtonPressed, SystemFunctionLockChanged и SystemFunctionLockIndicatorChanged одновременно.

  1. В этом первом фрагменте кода мы просто включаем необходимые пространства имен и указываем некоторые глобальные объекты, включая dispatcherQueue и объекты DispatcherQueueController для управления потоком SystemButtonEventController.

    Затем мы указываем маркеры событий, возвращаемые при регистрации делегатов обработки событий SystemButtonEventController .

    namespace winrt
    {
        using namespace Windows::System;
        using namespace Windows::UI::Input;
    }
    
    ...
    
    // Declare related members
    winrt::DispatcherQueueController _queueController;
    winrt::DispatcherQueue _queue;
    winrt::SystemButtonEventController _controller;
    winrt::event_token _fnKeyDownToken;
    winrt::event_token _fnKeyUpToken;
    winrt::event_token _fnLockToken;
    
  2. Кроме того, мы указываем маркер события для события SystemFunctionLockIndicatorChanged вместе с логическим значением, чтобы указать, находится ли приложение в режиме обучения (где пользователь просто пытается изучить клавиатуру без выполнения каких-либо функций).

    winrt::event_token _fnLockIndicatorToken;
    bool _isLearningMode = false;
    
  3. Этот третий фрагмент содержит соответствующие делегаты обработчика событий для каждого события, поддерживаемого объектом SystemButtonEventController .

    Каждый обработчик событий объявляет событие, которое произошло. Кроме того, обработчик FunctionLockIndicatorChanged также управляет тем, находится ли приложение в режиме "Обучение" (_isLearningMode = true), что препятствует возникновению события до других обработчиков и позволяет пользователю просматривать функции клавиатуры без фактического выполнения действия.

    void SetupSystemButtonEventController()
    {
        // Create dispatcher queue controller and dispatcher queue
        _queueController = winrt::DispatcherQueueController::CreateOnDedicatedThread();
        _queue = _queueController.DispatcherQueue();
    
        // Create controller based on new created dispatcher queue
        _controller = winrt::SystemButtonEventController::CreateForDispatcherQueue(_queue);
    
        // Add Event Handler for each different event
        _fnKeyDownToken = _controller->FunctionButtonPressed(
            [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: FunctionButtonEventArgs& args)
            {
                // Mock function to read the sentence "Fn button is pressed"
                PronounceFunctionButtonPressedMock();
                // Set Handled as true means this event is consumed by this controller
                // no more targets will receive this event
                args.Handled(true);
            });
    
            _fnKeyUpToken = _controller->FunctionButtonReleased(
                [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: FunctionButtonEventArgs& args)
                {
                    // Mock function to read the sentence "Fn button is up"
                    PronounceFunctionButtonReleasedMock();
                    // Set Handled as true means this event is consumed by this controller
                    // no more targets will receive this event
                    args.Handled(true);
                });
    
        _fnLockToken = _controller->FunctionLockChanged(
            [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: FunctionLockChangedEventArgs& args)
            {
                // Mock function to read the sentence "Fn shift is locked/unlocked"
                PronounceFunctionLockMock(args.IsLocked());
                // Set Handled as true means this event is consumed by this controller
                // no more targets will receive this event
                args.Handled(true);
            });
    
        _fnLockIndicatorToken = _controller->FunctionLockIndicatorChanged(
            [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: FunctionLockIndicatorChangedEventArgs& args)
            {
                // Mock function to read the sentence "Fn lock indicator is on/off"
                PronounceFunctionLockIndicatorMock(args.IsIndicatorOn());
                // In learning mode, the user is exploring the keyboard. They expect the program
                // to announce what the key they just pressed WOULD HAVE DONE, without actually
                // doing it. Therefore, handle the event when in learning mode so the key is ignored
                // by the system.
                args.Handled(_isLearningMode);
            });
    }
    

См. также

Класс SystemButtonEventController