检测并响应焦点会话状态

Windows 11引入了“焦点”功能,该功能通过启用“请勿打扰”模式,并静音任务栏中应用程序的图标闪烁和徽章通知,帮助用户最大限度地减少干扰。 本文介绍如何使用 FocusSessionManager API 检测焦点会话当前处于活动状态,或在焦点会话状态更改时接收更新,从而允许自定义应用的行为,以最大程度地减少焦点会话处于活动状态时的干扰。 有关焦点功能的详细信息,请参阅 如何在 Windows 11

获取当前焦点会话状态

在访问 FocusSessionManager 的属性之前,请检查 IsSupported 属性,确保它在当前设备上受支持。 验证是否支持该功能后,可以通过检查 IsFocusActive 属性来确定焦点会话当前是否处于活动状态。

private void UpdateStatusBar(string message)
{
    var focusActive = false;
    if (Windows.UI.Shell.FocusSessionManager.IsSupported)
    {
        var manager = Windows.UI.Shell.FocusSessionManager.GetDefault();
        focusActive = manager.IsFocusActive;
    }

    if (!focusActive)
    {
        statusTextBlock.Text = message;
    }
}

持续监视焦点状态

可以通过注册 IsFocusActiveChanged 事件来订阅,以在设备上的焦点会话状态发生更改时收到通知。 在以下示例中,SetAnimatedGifAutoPlay 是一个应用实现的辅助方法,用于更改应用是否根据当前焦点会话状态自动播放动态 GIF。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (Windows.UI.Shell.FocusSessionManager.IsSupported)
    {
        var manager = Windows.UI.Shell.FocusSessionManager.GetDefault();
        manager.IsFocusActiveChanged += Manager_IsFocusActiveChanged;
        SetAnimatedGifAutoPlay(true);
    }
}

private void Manager_IsFocusActiveChanged(Windows.UI.Shell.FocusSessionManager sender, object args)
{
    if(sender.IsFocusActive)
    {
        SetAnimatedGifAutoPlay(true);
    }
    else
    {
        SetAnimatedGifAutoPlay(false);
    }
}