当你开始使用 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 methods
param(
[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-ToastNotification
if (-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 完成响应时
通知消息:"任务已完成"
使用场景:执行长时间任务后提醒你回来查看结果
2. 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 使用体验!
相关文章:
……