通知与快捷键

原生操作系统通知与键盘快捷键注册表。

两个小小的主进程子系统为桌面外壳收尾:原生操作系统通知,以及键盘快捷键注册表。 二者都经由 Conveyor 接线,并尊重用户设置。

原生通知

lib/main/notifications.tsNotificationsService)封装了 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_IDcom.soarstarter.electron)。pnpm rebrand 会让它与安装包身份保持一致——如果 通知在 Windows 上静默,这是首先要检查的地方(参见 疑难排查)。macOS 无需额外的身份设置即可显示 通知。

试一试

Showcase 的通知演示就是活的测试——它调用 notify() 并展示返回的原因,因此你可以 直接观察 disabled/unsupported 两条分支。参见能力展示

键盘快捷键

lib/main/shortcuts.tsShortcutRegistry)是一个带有按用户覆盖的具名快捷键 注册表。每个定义都有一个 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渲染进程(例如命令面板)。应用内的按键处理,并非操作系统热键。
globalglobalShortcut——系统级。注册表支持,但默认不附带任何 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,而不是操作系统级别的绑定。面板的内容(路由、设置、最近 文件)来自命令源——参见界面与页面

相关页面

On this page