Claude Code 第六篇:自定义Windows系统通知!

当你开始使用 Claude Code 之后,肯定会遇到这样的场景:

让 Claude Code 执行一个耗时任务,然后切换到其他窗口工作,等你想起来回去看的时候,才发现它早就完成了。

还有更离谱的是:

你提了一个开发需求,就切其他软件了,好久之后你想起来,发现它根本就没有动工,而且在等你授权。直接浪费一个上午的时间,和 5 个小时的配额。哈哈!

我们非常需要一个明确的通知信息,让 Claude Code 高效工作,不摸鱼。

Claude Code 内置通知功能

很显然 Claude Code(CC)也考虑到了这一点,所以内置了一个通知功能。可以通过 /config 来进行设置。

输入命令之后,可以找到一个 notifications 选项。可以通过这个选项来进行设置。

这个选项默认为 auto,除此之外还有好几种通知方式。

可选项说明
terminal_bell终端响铃(发出“叮”的声音)
iterm2iTerm2 专用通知(仅 macOS)
iterm2_with_belliTerm2 通知 + 响铃

作为 Windows 用户,只有选择 Terminal Bell 才会有响动。

Claude Code 会在以下场景发送通知:

类型触发时机
permission_prompt需要你审批权限时(如执行命令、写入文件)
idle_promptClaude 等待你输入超过 60 秒时
elicitation_dialogMCP 工具需要你输入信息时
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}

这个脚本实现了如下功能:

  1. 优先使用 Windows 10/11 的 Toast 通知(现代化弹窗)
  2. 如果失败,回退到经典的气泡通知
  3. 支持自定义标题和消息内容

第二步:配置 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。

  1. Stop Hook —— 任务完成通知
触发条件:Claude Code 完成响应时通知消息:"任务已完成"使用场景:执行长时间任务后提醒你回来查看结果
  1. Notification Hook —— 需要交互通知

这个 Hook 需要指定 matcher 来匹配具体的通知类型:

matcher触发条件通知消息
permission_prompt需要你审批权限时“需要权限审批”
idle_prompt等待你输入超过 60 秒“等待你的输入”

注意idle_prompt 的 60 秒等待时间是固定的,无法修改。

效果展示

配置完成后,重启 Claude Code,就可以体验一下了。

具体触发时机为:

  1. 任务完成时 —— 桌面右下角弹出通知,告诉你可以回来看结果了
  2. 需要权限审批时 —— 立即弹出通知,不会错过任何需要确认的操作
  3. 长时间未响应时 —— 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 使用体验!

相关文章:

Claude Code 新手入门,官方指引!

Claude Code 换上国产引擎GLM4.7

……

Claude Code 第四篇:SKILL的创建,安装,查看原创

Claude Code 第五篇:操控 Chrome 浏览器!

 

小尾巴==========================
公众号:托尼不是塔克
交流群
知识星球
==============================

 



发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注