다음을 통해 공유


화면 판독기 및 하드웨어 시스템 단추

내레이터와 같은 화면 판독기는 하드웨어 시스템 단추 이벤트를 인식 및 처리하고 사용자에게 상태를 전달할 수 있어야 합니다. 경우에 따라 화면 판독기가 이러한 하드웨어 단추 이벤트를 단독으로 처리하고 다른 처리기로 버블 업하지 않도록 해야 할 수 있습니다.

Windows 10 버전 2004부터 UWP 애플리케이션은 다른 하드웨어 단추와 동일한 방식으로 Fn 하드웨어 시스템 단추 이벤트를 수신 대기하고 처리할 수 있습니다. 이전에는 이 시스템 단추가 다른 하드웨어 단추가 해당 이벤트 및 상태를 보고하는 방법에 대한 한정자로만 작동했습니다.

참고 항목

Fn 버튼 지원은 OEM에 따라 다르며 (시각 장애인 또는 시력에 문제가 있는 사용자에게는 도움이 되지 않을 수 있는) 해당 잠금 표시등과 함께 켜기/끄기 전환/잠금 기능(길게 누르기 키 조합과 비교)과 같은 기능을 포함할 수 있습니다.

Fn 단추 이벤트는 Windows.UI.Input 네임스페이스의 새 SystemButtonEventController 클래스를 통해 노출됩니다. SystemButtonEventController 개체는 다음 이벤트를 지원합니다.

Important

SystemButtonEventController는 우선 순위가 높은 처리기에 의해 이미 처리된 경우 이러한 이벤트를 받을 수 없습니다.

예제

다음 예제에서는 DispatcherQueue를 기반으로 SystemButtonEventController를 만들고 이 개체에서 지원하는 4개의 이벤트를 처리하는 방법을 보여줍니다.

Fn 단추를 누를 때 지원되는 이벤트 중 둘 이상이 발생하는 것이 일반적입니다. 예를 들어 Surface 키보드에서 Fn 단추를 누르면 SystemFunctionButtonPressed, SystemFunctionLockChanged 및 SystemFunctionLockIndicatorChanged가 동시에 실행됩니다.

  1. 이 첫 번째 조각에서는 필요한 네임스페이스를 포함하고 SystemButtonEventController 스레드를 관리하기 위한 DispatcherQueueDispatcherQueueController 개체를 비롯한 일부 전역 개체를 지정합니다.

    그런 다음, 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 클래스