Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Экранные считыватели, такие как Narrator, должны иметь возможность распознавать и обрабатывать события кнопок аппаратной системы и сообщать их состояние пользователям. В некоторых случаях средству чтения с экрана может понадобиться обработать эти события аппаратных кнопок исключительно и не позволить им передаваться другим обработчикам.
Чтобы прослушивать и обрабатывать события аппаратной системы Fn так же, как и другие аппаратные кнопки, используйте SystemButtonEventController в пространстве имен Windows.UI.Input пакета SDK для Windows.
Для приложений WinUI 3 или Windows App SDK этот API по-прежнему используется из пространства имен Windows (winrt::Windows::UI::Input), а не Microsoft.UI.*.
Замечание
Поддержка кнопки Fn зависит от изготовителя оборудования и может включать такие функции, как возможность переключения или блокировки (vs. сочетание клавиш с нажатием и удержанием), а также соответствующего индикатора блокировки (что не может быть полезно пользователям, которые слепы или имеют нарушения зрения).
События кнопки Fn предоставляются через SystemButtonEventController в пространстве имен Windows.UI.Input. Объект SystemButtonEventController поддерживает следующие события:
- СистемнаяКнопкаФункцииНажата
- КнопкаСистемнойФункцииОтпущена
- Изменение состояния блокировки системных функций
- ИзмененИндикаторБлокировкиФункцийСистемы
Это важно
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