如何通过编程开启/关闭Windows Focus Assist(专注助手)?
可行解决方案
旧方法失效原因
你用的SendMessage广播方式(hWnd=-1)无法正常控制专注助手,原因是:
SC_FOCUSASSIST并非通用的系统消息广播命令,广播会导致系统处理异常,进而卡住程序- 专注助手是系统级功能,Win32的消息发送方式已被Windows 10/11限制,不再支持通过这种方式控制
官方推荐的WinRT API方案
Windows 10及以上版本提供了官方WinRT API来控制专注助手,这是最可靠的方式,无需依赖注册表或不稳定的Win32消息。
实现步骤(C#)
- 确保你的项目支持WinRT(.NET 6+桌面应用可通过启用WinRT支持实现,UWP应用直接支持)
- 使用
FocusAssistSettings类控制专注助手状态:
using Windows.UI.Notifications.Management; using System.Threading.Tasks; public async Task ControlFocusAssist(FocusAssistMode targetMode) { var focusSettings = FocusAssistSettings.GetDefault(); // 检查是否具备修改权限 if (!focusSettings.CanChangeFocusAssistSettings) { // 请求用户授权 var accessStatus = await UserNotificationListener.RequestAccessAsync(); if (accessStatus != UserNotificationListenerAccessStatus.Allowed) { // 授权失败,可在此处理错误逻辑 return; } } // 设置目标模式 focusSettings.FocusAssistMode = targetMode; } // 调用示例: // 开启专注助手(优先通知模式) // await ControlFocusAssist(FocusAssistMode.PriorityOnly); // 开启专注助手(仅闹钟模式) // await ControlFocusAssist(FocusAssistMode.AlarmsOnly); // 关闭专注助手 // await ControlFocusAssist(FocusAssistMode.Off);
说明
FocusAssistMode有三个可选值:Off:关闭专注助手PriorityOnly:仅允许优先级列表中的通知AlarmsOnly:仅允许闹钟通知
- 该方法直接调用系统官方接口,不存在卡住或失效问题,且会同步系统设置
关于注册表方法的补充
Windows 10后期版本及Windows 11中,专注助手的设置已不再完全依赖注册表,修改注册表后需要重启系统才可能生效,且部分版本已禁用该修改方式,因此不推荐使用。
内容的提问来源于stack exchange,提问作者At Work
相关产品推荐
相关产品推荐

