Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Средства чтения с экрана, такие как экранный диктор, должны иметь возможность распознавать и обрабатывать события кнопок аппаратной системы и сообщать о своем состоянии пользователям. В некоторых случаях средство чтения с экрана может потребоваться обработать эти события аппаратной кнопки исключительно и не позволить им пузырьки до других обработчиков.
Начиная с Windows 10 версии 2004, приложения UWP могут прослушивать события аппаратной системы Fn так же, как и другие аппаратные кнопки. Ранее эта системная кнопка действовала только в качестве модификатора того, как другие аппаратные кнопки сообщили о своих событиях и состоянии.
Примечание.
Поддержка кнопки Fn зависит от изготовителя оборудования и может включать такие функции, как возможность переключения или блокировки (vs. сочетание клавиш с нажатием и удержанием), а также соответствующего индикатора блокировки (что не может быть полезно пользователям, которые слепы или имеют нарушения зрения).
События кнопки Fn предоставляются с помощью нового класса SystemButtonEventController в пространстве имен Windows.UI.Input . Объект SystemButtonEventController поддерживает следующие события:
- SystemFunctionButtonPressed
- SystemFunctionButtonReleased
- SystemFunctionLockChanged
- SystemFunctionLockIndicatorChanged
Внимание
SystemButtonEventController не может получать эти события, если они уже обработаны обработчиком с более высоким приоритетом.
Примеры
В следующих примерах показано, как создать SystemButtonEventController на основе диспетчера и обрабатывать четыре события, поддерживаемые этим объектом.
При нажатии кнопки Fn часто возникает несколько поддерживаемых событий. Например, нажатие кнопки Fn на клавиатуре Surface запускает SystemFunctionButtonPressed, SystemFunctionLockChanged и SystemFunctionLockIndicatorChanged одновременно.
В этом первом фрагменте кода мы просто включаем необходимые пространства имен и указываем некоторые глобальные объекты, включая 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;
Кроме того, мы указываем маркер события для события SystemFunctionLockIndicatorChanged вместе с логическим значением, чтобы указать, находится ли приложение в режиме обучения (где пользователь просто пытается изучить клавиатуру без выполнения каких-либо функций).
winrt::event_token _fnLockIndicatorToken; bool _isLearningMode = false;
Этот третий фрагмент содержит соответствующие делегаты обработчика событий для каждого события, поддерживаемого объектом 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); }); }
См. также
Windows developer