news 2026/10/16 3:40:30

DooTask 键盘 / 快捷键设置完全指南:桌面端、移动端与网页端的行为差异与实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DooTask 键盘 / 快捷键设置完全指南:桌面端、移动端与网页端的行为差异与实现原理
  • 后端
  • 前端
  • 协同办公
  • 即时通讯
  • 企业应用

【免费下载链接】dootask

DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。

项目地址:https://gitcode.com/gh_mirrors/do/dootask
点击查看免费下载

「键盘 / 快捷键设置」(简称「键盘设置」)是 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 / LinuxmacOS
打开搜索Ctrl + F或Ctrl + /Cmd + F或Cmd + /
创建群组Ctrl + UCmd + 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)时生效,未安装时设置页不展示该项且快捷键无效;
  • 注册冲突无提示:截图键或固定快捷键若被其他软件占用,ElectronglobalShortcut.register会静默失败,用户无法察觉;
  • 退出即失效:App 完全退出后全局快捷键不再可用(will-quit时unregisterAll),仅在进程运行(含后台 / 托盘)时生效。

八、不支持的能力清单

综合设置页与知识库负面清单,以下能力明确不支持:

  1. 全面自定义快捷键:仅截图键与发送行为可调,其余组合键固定(Cmd/Ctrl+N、Cmd/Ctrl+B等不可改);
  2. 按键组合录制:截图键输入框只接受单个字母 / 数字,不能录制Ctrl+Shift+Alt+X这类多组合键;
  3. 网页端全局快捷键:浏览器无法注册系统级热键,且浏览器自身快捷键优先;
  4. 移动端键盘快捷键:移动端无全局热键,交互依赖手势(gesture.md);
  5. 冲突检测提示:快捷键被占用时静默失败,无错误弹窗。

九、相关文档速查

  • 快捷键 / 键盘设置(本文主题)
  • 桌面端全局快捷键(注册原理、应用内导航)
  • 网页端快捷键(应用内键盘与浏览器边界)
  • 全局快捷键速查表(搜索、建群等更多全局键)
  • 移动端手势操作(移动端替代交互方式)
  • 源码参考:keyboard.vue(设置页 UI 与校验)、actions.js(默认值与持久化)、app.js(组合键拼接)、electron.js(Electron 注册 / 注销)、ChatInput/index.vue(发送行为逻辑)
  • 后端
  • 前端
  • 协同办公
  • 即时通讯
  • 企业应用

【免费下载链接】dootask

DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。

项目地址:https://gitcode.com/gh_mirrors/do/dootask
点击查看免费下载

相关推荐

上一篇:ViewBindingKTX 项目常见问题解决方案
下一篇:终极指南:GRUB2主题多分辨率完美适配从1080p到4K

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 3:39:23

HTML+CSS+JavaScript三件套:个人网站期末作业通关攻略

期末作业做出“能打”的个人网站&#xff1a;HTMLCSSJavaScript三件事怎么串成一条线每年的期末季&#xff0c;总有一批同学对着“HTMLCSSJavaScript个人网站”这种题目发愁。这个作业听起来平平无奇&#xff0c;就是做个个人网站嘛&#xff0c;但真的打开编辑器开始写的时候&a…

作者头像 李华
网站建设 2026/10/16 3:38:56

STM32F103 USART3 DMA收发实战:标准库配置与IDLE中断避坑指南

简介&#xff1a;面向STM32F103嵌入式开发者的一份标准库工程资源&#xff0c;核心演示如何利用DMA控制器实现USART3串口的高效接收与发送&#xff0c;解决实时通信场景中CPU频繁干预数据搬运的问题。适合具备基础STM32开发经验、希望掌握DMA与USART联动配置的工程师或学习者参…

作者头像 李华
网站建设 2026/10/16 3:38:54

从BIO到NIO再到Netty:高并发网络编程的进阶之路

七八年前我第一次用Java写网络服务时&#xff0c;代码特别单纯&#xff1a;一个ServerSocket、一个accept()循环、每个连接开一个线程去读数据。当时百来个连接跑得挺好&#xff0c;等连接数一上到几千&#xff0c;服务就开始频繁Full GC&#xff0c;线程栈和上下文切换把CPU吃…

作者头像 李华
网站建设 2026/10/16 3:37:33

三位数码管动态扫描原理与实现:从硬件连接到代码调试详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 3:37:29

Maven多模块依赖编译错误全解析:定位与根治

刚接手一个新项目&#xff0c;代码拉下来一编译&#xff0c;B模块报了一堆“Could not resolve dependencies”&#xff0c;C模块接着报“A cycle was detected in the path”&#xff0c;最离谱的是D模块说它依赖的某个类找不到&#xff0c;可我明明在E模块里见过那个类。那一…

作者头像 李华
网站建设 2026/10/16 3:36:48

构建主动预警体系:网络安全检测方法、工具与落地路线图

做安全的都懂&#xff0c;网络攻防从来不是比谁买的设备多&#xff0c;而是比谁能更快发现“已经发生但还没暴露”的入侵。我见过太多团队&#xff0c;防火墙、杀软、态势感知上了一整套&#xff0c;结果关键时刻还是靠运维偶然登录服务器才发现问题。根源在于他们把网络安全检…

作者头像 李华