- 后端
- 前端
- 协同办公
- 即时通讯
- 企业应用
【免费下载链接】dootask
DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。
「键盘 / 快捷键设置」(简称「键盘设置」)是 DooTask 个人设置(user-settings)体系中的一个子页面,用于在桌面端与移动端查看 / 调整系统级快捷键以及消息发送按钮行为。本文以该设置页为核心,完整覆盖其入口、可调项、固定快捷键、默认值与底层实现,并给出桌面端(Electron)、网页端(Web)、移动端(EEUI)三端的行为差异与源码佐证,帮助用户与开发者准确理解「哪些键可改、哪些键固定、改动何时生效」。
一、功能定位与入口
「键盘设置」解决的核心问题是:如何在不打扰浏览器默认行为的前提下,为桌面端与移动端提供「全局可触发」的快捷操作,并允许用户微调少数高频按键(截图键、消息发送行为)。
根据知识库文档(shortcut.md),该子页的入口分为三端:
- 桌面端 Electron:右上角头像 →「设置」→「键盘设置」
- 移动端 EEUI:「我的」→「设置」→「键盘设置」
- Web 浏览器:无此入口
前端路由定义可验证该子页的存在:routes.js 中注册了manage-setting-keyboard路由,其 path 为keyboard,对应组件 keyboard.vue。这也与 AI 助手深链映射一致(deep-links.js 中的setting_keyboard)。
注意:Web 浏览器端之所以没有该入口,是因为浏览器无法注册操作系统级全局快捷键(详见下文「各端能力对比」)。
二、可调项(用户可自定义的部分)
「键盘设置」页面只开放两类可调项,其余组合键全部固定。对应 UI 组件位于 keyboard.vue:
| 项 | 说明 | 取值范围 / 默认值 |
|---|---|---|
| 截图快捷键 | Electron 全局快捷键的最后一位字母可改,实际组合键为Cmd/Ctrl + Shift + <key> | 单个字母或数字,自动转大写;留空表示不绑定;默认A→ 实际触发Cmd/Ctrl + Shift + A |
| 桌面端发送按钮 | 影响消息输入框的「回车行为」 | Enter 发送(enter)或Cmd/Ctrl + Enter 发送(button);默认enter |
| 移动端发送按钮 | 影响键盘上发送键的行为 | button(开启:键盘发送键变换行,用 App 内浮动发送按钮发消息)或enter(关闭);默认button |
2.1 截图快捷键的表单校验
键盘设置组件 对截图键输入做了前端校验:
- 输入框
maxlength=2,只允许最后一个字符参与校验; - 校验规则为
/^[A-Za-z0-9]?$/,即只能输入字母或数字,否则提示「只能输入字母或数字」; - 输入内容会在
$nextTick中自动转为大写显示。
因此用户无法输入Ctrl+Shift+Enter之类组合键,也无法录制任意组合键——这是产品刻意限制(详见「不支持」章节)。
2.2 发送按钮的两个模式
从 keyboard.vue 可见发送按钮按端分别渲染:
- 桌面端(
$Electron分支):单选组send_button_desktop,两个选项:enter:「Enter 发送」button:「Cmd/Ctrl + Enter 发送」
- 移动端(
$isEEUIApp分支):单选组send_button_app:button(开启):键盘上的发送键被替换成换行,需点 App 内浮动发送按钮发消息enter(关闭):键盘发送键直接发送
该行为的实际生效逻辑位于聊天输入框组件 ChatInput/index.vue 的isEnterSend计算属性:EEUI 端取send_button_app === 'enter',桌面端取send_button_desktop === 'enter'。随后 Quill 编辑器的键盘绑定(index.vue)据此决定行为:
enter-short绑定(shortKey: true,即 Cmd/Ctrl + Enter):当不是Enter 发送模式时,触发onSend()并阻止默认换行;enter绑定(无 Shift):当是Enter 发送模式时,触发onSend()。
一句话总结:isEnterSend为真 → 裸 Enter 发送、Cmd/Ctrl+Enter 换行;为假 → 反过来。Shift+Enter 始终作为「软换行」保留(见网页端章节)。
三、固定快捷键(不可改)
桌面端 Electron 注册了一组系统级全局快捷键,在 App 处于后台 / 最小化 / 托盘时也能触发。下表与 keyboard.vue 中展示的只读提示一致,Mod在 macOS 为Command,Windows / Linux 为Ctrl,Alt对应 macOS 的Option:
| 操作 | 快捷键 | 备注 |
|---|---|---|
| 下载内容 | Cmd/Ctrl + Alt/Option + L | 打开下载管理器 |
| AI 助手 | Cmd/Ctrl + I | 需安装 AI 插件(aiVisible时才显示该项) |
| 新建任务 | Cmd/Ctrl + N | 弹出快速创建 |
| 新建项目 | Cmd/Ctrl + B | |
| 新会议 | Cmd/Ctrl + J | |
| 打开设置 | Cmd/Ctrl + , |
与全局快捷键速查表(global.md)横向对照,桌面端还包含:
| 操作 | Windows / Linux | macOS |
|---|---|---|
| 打开搜索 | Ctrl + F或Ctrl + / | Cmd + F或Cmd + / |
| 创建群组 | Ctrl + U | Cmd + U |
这些组合键均为固定绑定、不支持改键,设置页只做展示(FormItem无输入控件)。从源码看,桌面端注册原理为 Electron 的globalShortcutAPI:
- 应用
will-quit时调用globalShortcut.unregisterAll()(electron.js); - 截图键通过 IPC 通道
bindScreenshotKey动态注册 / 注销(见下文「实现原理」); - 若快捷键被其他软件抢先占用,注册会静默失败且无错误提示(知识库 桌面端全局快捷键 明确记录)。
四、字段默认值与持久化
store/actions.js 中的handleKeyboardaction 定义了默认值与存储位置:
data.screenshot_key = (data.screenshot_key || "").trim().toLowerCase() data.send_button_app = data.send_button_app || 'button' // 移动端发送按钮,默认 button(显示发送按钮) data.send_button_desktop = data.send_button_desktop || 'enter' // 桌面端发送按钮,默认 enter(键盘回车发送) window.localStorage.setItem("__system:keyboardConf__", $A.jsonStringify(data)) state.cacheKeyboard = data由此可确认三个默认值:
- 截图键默认
A→ 实际触发Cmd/Ctrl + Shift + A(值在存储时被toLowerCase归一,Electron 端注册时再拼回完整组合键); - 桌面端发送:默认 Enter 发送(
send_button_desktop = 'enter'); - 移动端发送:默认按浮动按钮(
send_button_app = 'button')。
配置持久化在浏览器localStorage的__system:keyboardConf__键下,同时缓存到 Vuexstate.cacheKeyboard(state.js)。桌面端渲染层在初始化时读取该缓存并调用$A.bindScreenshotKey(App.vue),确保应用重启后截图快捷键依然生效。
五、实现原理:从「改键」到「全局生效」的完整链路
「快捷键改动只影响当前用户当前终端,不上云;修改后立刻生效,无需重启 Electron」——这两个特性可以从源码链路得到印证。
5.1 保存即生效
键盘设置组件 的submitForm:
this.$store.dispatch('handleKeyboard', this.formData).then((data) => { if (this.$Electron) { $A.bindScreenshotKey(data); } $A.messageSuccess('保存成功'); });保存成功后立即调用$A.bindScreenshotKey(data),将新截图键推送给 Electron 主进程——无需重启客户端。
5.2 渲染层拼键
$A.bindScreenshotKey 负责把「单个字母」拼成完整组合键:
key = /macintosh|mac os x/i.test(navigator.userAgent) ? 'command' : 'ctrl' key = `${key}+shift+${screenshot_key.toLowerCase()}` $A.Electron.sendMessage('bindScreenshotKey', {key});这里根据 UA 判断 macOS 用command、其余平台用ctrl,与知识库中「Mac 用 Cmd、Windows/Linux 用 Ctrl」的约定完全一致。
5.3 主进程注册 / 注销
electron.js 中的 IPC 处理器:
ipcMain.on('bindScreenshotKey', (event, args) => { const { key } = args; if (screenshotKey !== key) { if (screenshotKey) { globalShortcut.unregister(screenshotKey) // 先注销旧键 screenshotKey = null } if (key) { screenshotKey = key globalShortcut.register(key, () => { screenshotObj.startCapture().then(_ => { ... }) }) } } event.returnValue = "ok" })要点:
- 键值变更时才操作,避免重复注册;
- 注册的回调调用
screenshotObj.startCapture()启动截图,截图对象由electron-screenshots-tool创建(electron.js,依赖声明见 package.json); - 留空(
key为空字符串)表示不绑定:此时仅注销旧键、不注册新键,对应知识库「留空表示不绑定」的说明。
5.4 为什么「不上云」
配置存放在浏览器 / Electron 本地存储(localStorage),后端接口不参与读写,因此更换终端或账号换设备后需重新设置——这正是「只影响当前用户当前终端,不上云」的由来。
六、各端能力对比:桌面端 / 网页端 / 移动端
为帮助判断「我在哪个端、能改什么」,汇总知识库三个相关 chunk 的边界:
| 能力 | 桌面端 Electron | 网页端(浏览器) | 移动端 EEUI |
|---|---|---|---|
| 「键盘设置」入口 | ✅ 有 | ❌ 无 | ✅ 有 |
| 系统级全局快捷键(后台 / 托盘可触发) | ✅ 有 | ❌ 无(仅页面聚焦时生效) | ❌ 无(用手势) |
| 截图快捷键(可自定义) | ✅ 有 | ❌ 无 | ❌ 无 |
| 发送按钮模式(Enter / Mod+Enter) | ✅ 有 | ✅ 有(同一定义,见下) | ✅ 有 |
| 自定义全部快捷键 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
6.1 网页端:应用内键盘与浏览器优先权
网页端不能注册全局快捷键,只在 DooTask 标签页处于焦点时生效(web-client/shortcut.md)。其应用内快捷键包括:
- 富文本:
Cmd/Ctrl + B加粗、Cmd/Ctrl + I斜体、Cmd/Ctrl + Z撤销、Cmd/Ctrl + Shift + Z(macOS)/Ctrl + Y(Windows)重做; - 表单 / 弹窗:
Enter提交、Esc取消; - 消息:默认
Enter发送、Shift + Enter换行;可在「个人设置 → 键盘」切换为Cmd/Ctrl + Enter发送、Enter换行。
关键边界:浏览器自身快捷键(如Cmd+T新建标签、Cmd+W关闭标签)优先生效,DooTask 不接管;Cmd+S/Cmd+P等同样会被浏览器吞掉。知识库负面清单中明确记载「Web 浏览器 Cmd+S / Cmd+P 等会被浏览器吞掉,DooTask 不接管」。
6.2 桌面端独占项
以下快捷键需要操作系统级注册,仅 Electron 桌面端提供(见 web-client/shortcut.md「不在网页端的快捷键」):
Cmd/Ctrl + I唤起 AI 助手Cmd/Ctrl + N新建任务Cmd/Ctrl + B新建项目Cmd/Ctrl + J新建会议Cmd/Ctrl + ,打开设置- 截图快捷键(用户自定义)
同时桌面端还有一组应用内导航快捷键(electron-client/shortcut.md):后退Cmd + ←(Windows 为Alt + ←)、前进Cmd + →(Alt + →)、刷新Cmd + R(Ctrl + R/F5)、强制刷新Cmd/Ctrl + Shift + R、关闭窗口Cmd + W(Ctrl + W)、退出 AppCmd + Q(Alt + F4)。
6.3 移动端:无键盘快捷键,只有手势
移动端不提供键盘快捷键(global.md 明确标注移动端为「无」),交互能力由 移动端手势操作 承担(长按、左滑、下拉刷新、双指捏合等)。「键盘设置」在移动端仅承担发送按钮行为的调整。
七、与其他模块的关系与生效边界
- 仅影响本机:快捷键配置存储于本地,不与云端同步,换终端需重新配置;
- 立即生效:截图键保存后即时注册,无需重启 Electron;
- 依赖 AI 插件:
Cmd/Ctrl + I仅在 AI 微应用已安装(aiVisible)时生效,未安装时设置页不展示该项且快捷键无效; - 注册冲突无提示:截图键或固定快捷键若被其他软件占用,Electron
globalShortcut.register会静默失败,用户无法察觉; - 退出即失效:App 完全退出后全局快捷键不再可用(
will-quit时unregisterAll),仅在进程运行(含后台 / 托盘)时生效。
八、不支持的能力清单
综合设置页与知识库负面清单,以下能力明确不支持:
- 全面自定义快捷键:仅截图键与发送行为可调,其余组合键固定(
Cmd/Ctrl+N、Cmd/Ctrl+B等不可改); - 按键组合录制:截图键输入框只接受单个字母 / 数字,不能录制
Ctrl+Shift+Alt+X这类多组合键; - 网页端全局快捷键:浏览器无法注册系统级热键,且浏览器自身快捷键优先;
- 移动端键盘快捷键:移动端无全局热键,交互依赖手势(gesture.md);
- 冲突检测提示:快捷键被占用时静默失败,无错误弹窗。
九、相关文档速查
- 快捷键 / 键盘设置(本文主题)
- 桌面端全局快捷键(注册原理、应用内导航)
- 网页端快捷键(应用内键盘与浏览器边界)
- 全局快捷键速查表(搜索、建群等更多全局键)
- 移动端手势操作(移动端替代交互方式)
- 源码参考:keyboard.vue(设置页 UI 与校验)、actions.js(默认值与持久化)、app.js(组合键拼接)、electron.js(Electron 注册 / 注销)、ChatInput/index.vue(发送行为逻辑)
- 后端
- 前端
- 协同办公
- 即时通讯
- 企业应用
【免费下载链接】dootask
DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。
相关推荐
DooTask 网页端快捷键完全指南:应用内键盘操作、消息发送模式与桌面端全局快捷键边界
DooTask 网页端快捷键完全指南:应用内键盘操作、消息发送模式与桌面端全局快捷键边界 DooTask 网页端(Web 浏览器)提供了一套基于浏览器焦点事件的
后端前端协同办公即时通讯企业应用DooTask 桌面端全局快捷键完全指南:注册原理、快捷键总览与截图热键自定义
DooTask 桌面端全局快捷键完全指南:注册原理、快捷键总览与截图热键自定义 DooTask 桌面客户端(基于 Electron 38 打包)在网页端之外注册
后端前端协同办公即时通讯企业应用DooTask 新建任务入口全指南:桌面端、移动端路径与快捷键详解
DooTask 新建任务入口全指南:桌面端、移动端路径与快捷键详解 DooTask 是一款开源在线项目任务管理工具,其"新建任务"入口贯穿桌面端、移动端与快捷键
后端前端协同办公即时通讯企业应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考