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;
}
}
// pch.h
...
#include <winrt/Windows.UI.Shell.h>
// MainWindow.xaml.h
...
Windows::UI::Shell::FocusSessionManager m_focusSessionManager = Windows::UI::Shell::FocusSessionManager::GetDefault();
void UpdateStatusBar(winrt::hstring const& message);
// MainWindow.xaml.cpp
...
void MainWindow::UpdateStatusBar(winrt::hstring const& message)
{
auto focusActive = false;
if (Windows::UI::Shell::FocusSessionManager::IsSupported())
{
focusActive = m_focusSessionManager.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);
}
}
// pch.h
...
#include <winrt/Windows.UI.Shell.h
#include <winrt/Windows.UI.Xaml.Navigation.h>
// MainWindow.xaml.h
...
void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const&);
Windows::UI::Shell::FocusSessionManager m_focusSessionManager = Windows::UI::Shell::FocusSessionManager::GetDefault();
winrt::event_token m_focusStateChangedToken;
void OnFocusStateChanged(Windows::UI::Shell::FocusSessionManager const& sender, Windows::Foundation::IInspectable const&);
// MainWindow.xaml.cpp
...
void MainWindow::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const&)
{
if (Windows::UI::Shell::FocusSessionManager::IsSupported())
{
m_focusStateChangedToken = m_focusSessionManager.IsFocusActiveChanged(
{ get_weak(), &MainWindow::OnFocusStateChanged });
SetAnimatedGifAutoPlay(true);
}
}
void MainWindow::OnFocusStateChanged(Windows::UI::Shell::FocusSessionManager const& sender,
Windows::Foundation::IInspectable const&)
{
auto temp = m_focusSessionManager.IsFocusActive();
SetAnimatedGifAutoPlay(m_focusSessionManager.IsFocusActive());
}