通知与快捷键
原生操作系统通知与键盘快捷键注册表。
两个小小的主进程子系统为桌面外壳收尾:原生操作系统通知,以及键盘快捷键注册表。 二者都经由 Conveyor 接线,并尊重用户设置。
原生通知
lib/main/notifications.ts(NotificationsService)封装了 Electron 的
Notification。渲染进程通过 notification Conveyor 领域触发它:
const { notify } = useConveyor('notification')
await notify({ title: '导出完成', body: '你的备份已保存。' })notify() 返回一个类型化结果而非抛出异常,因此调用方可以针对通知未显示的原因
做出反应:
| 结果 | 何时 |
|---|---|
{ ok: true } | 已显示。 |
{ ok: false, reason: 'disabled' } | 用户关闭了通知(settings.notifications,默认开启)。 |
{ ok: false, reason: 'unsupported' } | 本平台上 Notification.isSupported() 为 false;该服务还会记录一条警告。 |
通知设置标签页切换 settings.notifications,服务会在每次调用时检查它——无需
重启。
Windows 身份(AUMID)
要让通知归属到你的应用(并在安装后延续),Windows 需要一个稳定的 AppUserModelID。本模板将它锁定为应用 id,并在启动时设置:
// lib/main/main.ts
electronApp.setAppUserModelId(APP_USER_MODEL_ID)在 shared/constants.ts 中,APP_USER_MODEL_ID 等于 APP_ID
(com.soarstarter.electron)。pnpm rebrand 会让它与安装包身份保持一致——如果
通知在 Windows 上静默,这是首先要检查的地方(参见
疑难排查)。macOS 无需额外的身份设置即可显示
通知。
试一试
Showcase 的通知演示就是活的测试——它调用 notify() 并展示返回的原因,因此你可以
直接观察 disabled/unsupported 两条分支。参见能力展示。
键盘快捷键
lib/main/shortcuts.ts(ShortcutRegistry)是一个带有按用户覆盖的具名快捷键
注册表。每个定义都有一个 id、一个默认加速键、一个作用域(scope)与一段
描述:
// lib/main/shortcuts.ts
export const DEFAULT_SHORTCUTS = [
{ id: 'nav.home', defaultAccelerator: 'CmdOrCtrl+1', scope: 'menu', description: 'Open Home' },
{ id: 'nav.open-file', defaultAccelerator: 'CmdOrCtrl+O', scope: 'menu', description: 'Open File' },
{ id: 'nav.settings', defaultAccelerator: 'CmdOrCtrl+,', scope: 'menu', description: 'Open Settings' },
{ id: 'palette.open', defaultAccelerator: 'CmdOrCtrl+K', scope: 'in-window', description: 'Open Command Palette' },
]| 作用域 | 由谁绑定 | 说明 |
|---|---|---|
menu | 原生应用菜单(加速键)。 | 仅在应用聚焦时生效。 |
in-window | 渲染进程(例如命令面板)。 | 应用内的按键处理,并非操作系统热键。 |
global | globalShortcut——系统级。 | 注册表支持,但默认不附带任何 global 快捷键。 |
get(id) 解析用户覆盖(settings.shortcuts[id])或默认值,resolveForPlatform
在 macOS 上把 CmdOrCtrl 换成 Cmd、在其他平台上换成 Ctrl。启动时,若两个 id
解析到同一个加速键,validateAtStartup() 会记录一条警告。
registerGlobal() 会拒绝任何作用域不是 global 的 id,而四个内置快捷键都只是
menu/in-window——因此本模板开箱不注册任何系统级热键。要添加一个,请
定义一个 global 作用域的快捷键,并在启动时调用 registerGlobal(id, handler)。
快捷键设置标签页
ShortcutsSection 调用 useConveyor('shortcut').list(),并渲染每个快捷键的描述、
id 与解析后的加速键。它目前是只读的——只展示当前的绑定。覆盖的管道已端到端
存在(设置 schema 中的 shortcuts 映射,以及尊重它的 get()),因此构建一个
重新绑定控件,只需通过 updateSettings 写入覆盖即可——参见
设置存储。
命令面板 vs 全局快捷键
命令面板用 Cmd/Ctrl+K 打开,但那是一个由渲染进程处理的应用内
快捷键(app/components/command-palette/)——并非全局热键。它只在某个窗口聚焦时
触发。把它当作应用 UI,而不是操作系统级别的绑定。面板的内容(路由、设置、最近
文件)来自命令源——参见界面与页面。
