Claude Code 第六篇:自定义Windows系统通知!
当你开始使用 Claude Code 之后,肯定会遇到这样的场景:
让 Claude Code 执行一个耗时任务,然后切换到其他窗口工作,等你想起来回去看的时候,才发现它早就完成了。
还有更离谱的是:

你提了一个开发需求,就切其他软件了,好久之后你想起来,发现它根本就没有动工,而且在等你授权。直接浪费一个上午的时间,和 5 个小时的配额。哈哈!
我们非常需要一个明确的通知信息,让 Claude Code 高效工作,不摸鱼。
Claude Code 内置通知功能
很显然 Claude Code(CC)也考虑到了这一点,所以内置了一个通知功能。可以通过 /config 来进行设置。

输入命令之后,可以找到一个 notifications 选项。可以通过这个选项来进行设置。
这个选项默认为 auto,除此之外还有好几种通知方式。
| 可选项 | 说明 |
|---|---|
terminal_bell | 终端响铃(发出“叮”的声音) |
iterm2 | iTerm2 专用通知(仅 macOS) |
iterm2_with_bell | iTerm2 通知 + 响铃 |
作为 Windows 用户,只有选择 Terminal Bell 才会有响动。
Claude Code 会在以下场景发送通知:
| 类型 | 触发时机 |
|---|---|
permission_prompt | 需要你审批权限时(如执行命令、写入文件) |
idle_prompt | Claude 等待你输入超过 60 秒时 |
elicitation_dialog | MCP 工具需要你输入信息时 |
auth_success | 认证成功时 |
自定义 Claude Code 通知
通过内置的通知功能,可以解决一些问题。
但是这个通知的效果非常有限。
首先,它只有 duang 的一声,没有任何其他提示,很容易被忽略。
其次,任务结束的时候,连 duang 的一声都没有。
这样肯定不行!
经过分析发现,我们可以通过 CC 的 Hook 事件来优化通知功能。
Hooks 是 CC 提供的扩展机制,允许你在特定事件发生时执行自定义命令或脚本。
Hooks 支持的事件:
| 事件 | 触发时机 |
|---|---|
PreToolUse | 工具调用前 |
PostToolUse | 工具调用后 |
Notification | 发送通知时 |
Stop | 任务完成时 |
SubagentStop | 子代理任务完成时 |
PreCompact | 上下文压缩前 |
SessionStart | 会话启动时 |
SessionEnd | 会话结束时 |
我们可以通过处理 Hook 事件,来弹出 Windows 原生通知,就是右下角的那种通知,除了声音之外,还会有明显的通知消息。
实战:打造 Windows 桌面通知
知道了原理之后就可以动手修改了。
第一步:创建通知脚本
想要调用 Windows 的系统通知,我们可以用好多种方式。最简单的就是直接用 PowerShell 脚本来实现。
所以我们最好是先创建一个 PowerShell(PS)脚本。不用担心不会写脚本。这一切就交给 Claude Code 自己来完成。
你只要把需求说清楚。
为了方便大家快速复现,快速使用,我就直接贴 AI 写完的代码了。
创建文件 windows-notification.ps1。
然后把它放到用户目录 ~/.claude/hooks/ 下面。
里面写入脚本:
# Windows Notification for Claude Code# Compatible with Windows 10/11 using multiple fallback methodsparam( [string]$Title = "Claude Code", [string]$Message = "Task Completed")# Method 1: Try Windows Toast Notification (Windows 10/11)function Send-ToastNotification { try { [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null $template = '<toast><visual><binding template="ToastText02"><text id="1">' + $Title + '</text><text id="2">' + $Message + '</text></binding></visual><audio src="ms-winsoundevent:Notification.Default"/></toast>' $xml = New-Object Windows.Data.Xml.Dom.XmlDocument $xml.LoadXml($template) $toast = [Windows.UI.Notifications.ToastNotification]::new($xml) [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('ClaudeCode').Show($toast) return $true } catch { return $false }}# Method 2: Use Windows Forms Balloon Notification (Fallback)function Send-BalloonNotification { try { Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $notification = New-Object System.Windows.Forms.NotifyIcon $notification.Icon = [System.Drawing.SystemIcons]::Information $notification.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Info $notification.BalloonTipTitle = $Title $notification.BalloonTipText = $Message $notification.Visible = $true $notification.ShowBalloonTip(5000) Start-Sleep -Milliseconds 5000 $notification.Dispose() return $true } catch { return $false }}# Try methods in order$success = Send-ToastNotificationif (-not $success) { Write-Host "Toast notification failed, trying balloon notification..." $success = Send-BalloonNotification}if ($success) { Write-Host "Notification sent successfully" exit 0} else { Write-Host "All notification methods failed" exit 1}
这个脚本实现了如下功能:
- 优先使用 Windows 10/11 的 Toast 通知(现代化弹窗)
- 如果失败,回退到经典的气泡通知
- 支持自定义标题和消息内容
第二步:配置 Hooks
实现了具体的脚本并测试成功之后,就可以添加触发配置了。
编辑 ~/.claude/settings.json,添加 Hooks 配置:
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy Bypass -File \"%USERPROFILE%\\.claude\\hooks\\windows-notification.ps1\" -Title \"Claude Code\" -Message \"任务已完成\"", "timeout": 10 } ] } ], "Notification": [ { "matcher": "permission_prompt", "hooks": [ { "type": "command", "command": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy Bypass -File \"%USERPROFILE%\\.claude\\hooks\\windows-notification.ps1\" -Title \"Claude Code\" -Message \"需要权限审批\"", "timeout": 10 } ] }, { "matcher": "idle_prompt", "hooks": [ { "type": "command", "command": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy Bypass -File \"%USERPROFILE%\\.claude\\hooks\\windows-notification.ps1\" -Title \"Claude Code\" -Message \"等待你的输入\"", "timeout": 10 } ] } ] }}
配置说明
我这里是配置了两类 Hook。
- Stop Hook —— 任务完成通知
触发条件:Claude Code 完成响应时通知消息:"任务已完成"使用场景:执行长时间任务后提醒你回来查看结果
- Notification Hook —— 需要交互通知
这个 Hook 需要指定 matcher 来匹配具体的通知类型:
| matcher | 触发条件 | 通知消息 |
|---|---|---|
permission_prompt | 需要你审批权限时 | “需要权限审批” |
idle_prompt | 等待你输入超过 60 秒 | “等待你的输入” |
注意:
idle_prompt的 60 秒等待时间是固定的,无法修改。
效果展示
配置完成后,重启 Claude Code,就可以体验一下了。

具体触发时机为:
- 任务完成时 —— 桌面右下角弹出通知,告诉你可以回来看结果了
- 需要权限审批时 —— 立即弹出通知,不会错过任何需要确认的操作
- 长时间未响应时 —— 60 秒后弹出提醒,避免 Claude 一直干等
这样设置之后,再也不用担心错过 Claude Code 的消息了!
思维扩散一下,除了调用系统通知之外,你也可以给不同事件添加一下好玩的音效或者录音。
这里有一个需要注意的点:
这个 hook 机制似乎只有用 Claude Code 官方模型才能触发,切换 GLM-4.7 等第三方模型之后,无法触发。
官方的优势,体现出来了。
总结
通过 Hooks 机制,我们成功让 Claude Code 在 Windows 上拥有了原生桌面通知能力:
| 功能 | 实现方式 |
|---|---|
| 任务完成通知 | Stop Hook |
| 权限审批通知 | Notification Hook + permission_prompt matcher |
| 等待输入通知 | Notification Hook + idle_prompt matcher |
Hooks 的能力远不止于此,你还可以用它来:
- 自动记录操作日志
- 在特定操作前进行额外检查
- 与其他工具集成(如 Slack 通知、邮件提醒等)
希望这篇文章能帮助你打造更高效的 Claude Code 使用体验!
相关文章:
……