Čtečky obrazovky a tlačítka hardwarového systému

Čtečky obrazovky, například Narrátor, musí být schopné rozpoznat a zpracovat události hardwarových systémových tlačítek a komunikovat jejich stavy uživatelům. V některých případech může čtečka obrazovky potřebovat tyto události hardwarových tlačítek zpracovat výhradně a nezanechat je, aby se přenesly k jiným zpracovatelům.

Pokud chcete naslouchat událostem hardwarového systému Fn a zpracovávat je stejným způsobem jako ostatní hardwarová tlačítka, použijte SystemButtonEventController v oboru názvů Windows.UI.Input sady Windows SDK.

U aplikací WinUI 3 / Windows App SDK se toto rozhraní API stále využívá z oboru názvů Systému Windows (winrt::Windows::UI::Input) místo Microsoft.UI.*.

Poznámka:

Podpora tlačítek Fn je specifická pro OEM a může obsahovat funkce, jako je možnost zapnout nebo vypnout (vs. kombinace kláves stiskem a podržením), spolu s odpovídajícím indikátorem zámku (což nemusí být užitečné pro uživatele, kteří jsou nevidomí nebo mají poruchu zraku).

Události tlačítka Fn jsou zpřístupněny prostřednictvím SystemButtonEventController v oboru názvů Windows.UI.Input . SystemButtonEventController objekt podporuje následující události:

Důležité

SystemButtonEventController nemůže přijímat tyto události, pokud již byly zpracovány obslužnou rutinou s vyšší prioritou.

Příklady

V následujících příkladech si ukážeme, jak vytvořit SystemButtonEventController na základě DispatcherQueue a zpracovat čtyři události podporované tímto objektem.

Při stisknutí tlačítka Fn je běžné, že se aktivuje více než jedna z podporovaných událostí. Například stisknutí tlačítka Fn na klávesnici Surface aktivuje systemFunctionButtonPressed, SystemFunctionLockChanged a SystemFunctionLockIndicatorChanged současně.

  1. V tomto prvním fragmentu kódu jednoduše zahrneme požadované obory názvů a zadáme některé globální objekty, včetně objektů DispatcherQueue a DispatcherQueueController, pro správu vlákna SystemButtonEventController.

    Poté určíme tokeny událostí , které se vrátí při registraci delegátů zpracovávajících události v 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. Také určíme token události pro událost SystemFunctionLockIndicatorChanged spolu s logickou hodnotou označující, jestli je aplikace v režimu učení (kde se uživatel jednoduše pokouší prozkoumat klávesnici bez provádění žádných funkcí).

    winrt::event_token _fnLockIndicatorToken;
    bool _isLearningMode = false;
    
  3. Tento třetí fragment kódu obsahuje odpovídající delegáty obslužné rutiny událostí pro každou událost podporovanou SystemButtonEventController objektu.

    Každý obslužný proces události oznamuje událost, která nastala. Kromě toho obslužná rutina SystemFunctionLockIndicatorChanged také určuje, jestli je aplikace v režimu Učení (_isLearningMode = true), což brání události v bublání na jiné obslužné rutiny a umožňuje uživateli prozkoumat funkce klávesnice bez skutečného provedení akce.

    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->SystemFunctionButtonPressed(
            [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: SystemFunctionButtonEventArgs& 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->SystemFunctionButtonReleased(
                [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: SystemFunctionButtonEventArgs& 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->SystemFunctionLockChanged(
            [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: SystemFunctionLockChangedEventArgs& 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->SystemFunctionLockIndicatorChanged(
            [](const winrt::SystemButtonEventController& /*sender*/, const winrt:: SystemFunctionLockIndicatorChangedEventArgs& 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);
            });
    }
    

Viz také

Třída SystemButtonEventController