applescript 无法直接注册或拦截 macos 全局快捷键,因其无系统级事件监听能力、无常驻进程、不支持底层事件钩子且受辅助功能权限限制;需借助 hammerspoon 等工具作为桥梁监听快捷键后调用 applescript 执行自动化任务。
applescript 本身无法直接注册或拦截 macos 全局快捷键(如 cmd+space、ctrl+shift+4 等),因为它没有系统级事件监听能力,也不具备热键注册接口。这是 applescript 的根本限制——它是一个自动化脚本语言,依赖于 apple events 与已运行的应用交互,而非底层事件循环。
为什么 AppleScript 不能直接拦截全局快捷键
macOS 全局快捷键由系统事件处理机制(如 Carbon 或 AppKit 的 NSEvent.addGlobalMonitorForEventsMatchingMask)管理,需在有运行中、启用辅助功能权限的 Cocoa 应用内实现。AppleScript 没有进程常驻能力,也无法调用这些 API。
- 运行即结束:AppleScript 脚本执行完就退出,无法持续监听键盘事件
- 无事件钩子:不支持
CGEventTap、NSEvent监听等底层机制 - 权限受限:即使通过
osascript调用,也无法绕过辅助功能(Accessibility)授权要求
可行的替代方案(推荐组合)
要实现“全局快捷键触发 AppleScript 逻辑”,需借助一个轻量级常驻应用作为桥梁,它监听快捷键,再调用 AppleScript 脚本。常用可靠方式如下:
- Hammerspoon(Lua 脚本引擎):免费开源,原生支持全局热键、窗口管理、Shell/AppleScript 调用,配置灵活,无需 Xcode
- Keyboard Maestro(商业软件):图形化配置,可直接绑定快捷键并执行 AppleScript,对新手友好
-
自建 Swift/macOS App:使用
NSEvent.addGlobalMonitorForEventsMatchingMask+NSAppleScript或Process执行脚本,需开启辅助功能权限
例如,在 Hammerspoon 中,你可以这样写:
hs.hotkey.bind({"cmd", "alt"}, "T", function()
hs.osascript.applescript([[
display notification "Hello from global shortcut!" with title "Hammerspoon"
]])
end)
关键前提:辅助功能权限必须开启
任何能监听全局按键的工具(包括 Hammerspoon、Keyboard Maestro、自写 App)都必须被添加到:
系统设置 → 隐私与安全性 → 辅助功能(或旧版“辅助功能 → 无障碍”)中,并勾选允许。
- 首次触发快捷键时,系统通常会弹窗提示授权;若没弹出,请手动添加
- 终端启动的工具(如 Hammerspoon)需添加其实际运行进程(如
Hammerspoon.app),而非Terminal - 权限变更后,可能需要重启工具或 macOS
AppleScript 可参与的环节(正确定位角色)
AppleScript 不做“监听”,但非常适合做“响应”——即在快捷键被其他工具捕获后,交由它完成具体自动化任务:
- 控制 Finder、Mail、Safari 等原生应用(
tell application "Finder" to reveal...) - 读写剪贴板、操作文件、发送通知、触发 Automator 工作流
- 配合
do shell script调用命令行工具(如curl、jq)增强能力
把 AppleScript 当作“业务逻辑层”,把 Hammerspoon/Keyboard Maestro 当作“事件入口层”,分工明确,稳定高效。











