DeskHop - 快速桌面切换
你有没有注意到,在这个疯狂的科技世界里,总有那么一个古怪的小项目试图解决一个如此小众的问题,以至于它唯一的竞争对手可能是左撇子用的螺丝刀和会自己藏起来的闹钟?
我在日常工作流程中使用两台不同的电脑,并在它们之间共享一套键盘和鼠标。尝试了几个在亚马逊上找到的USB切换盒后,我意识到它们都存在类似的问题 - 切换需要一段时间,当试图找到按钮时过程相当笨拙,而且说实话,随着时间的推移它也不会变得更好。
我想要的只是一种方法,可以用键盘快捷键快速切换输出,再加上通过神奇地在显示器之间移动鼠标指针来实现同样的功能。这个项目让你可以同时实现这两点,即使你的电脑运行不同的操作系统!
![图片]
特点
- 完全免费和开源
- 切换时没有明显延迟
- 只需将鼠标指针拖动到两台电脑之间
- 无需安装软件
- 价格实惠且容易获得的组件(<15欧元)
- 3D打印卡扣式外壳
- 输出之间完全电气隔离
- 适用于Linux、macOS和Windows
工作原理
该设备充当键盘/鼠标和电脑之间的中介,同时与两台电脑建立并保持连接。然后根据你的选择决定将鼠标和按键转发到哪里。键盘跟随鼠标,反之亦然,所以只需将鼠标拖到另一个桌面就可以同时切换两者。
鼠标
为了让鼠标光标神奇地跳转,鼠标HID报告描述符被更改为使用绝对坐标,然后鼠标报告(仍以相对移动形式传入)在内部累积,准确记录位置。
当你试图离开显示器区域朝另一个显示器的方向移动时,它会保持Y坐标并将最大X值替换为最小X值,然后翻转输出。这确保了光标无缝地出现在另一个显示器的相同高度,增强了平滑过渡的感觉。
![图片]
将鼠标从Mac拖到Linux会自动切换输出。
实际的切换发生在一个箭头停止移动而另一个箭头开始移动的那一刻。
键盘
作为USB主机并定期查询你的键盘,它在HID报告中寻找预先配置的热键(通常对我来说是Caps Lock)。找到后,它会将所有后续字符转发到另一个输出。
为了在任何时候都能直观地指示你正在使用哪个输出,你可以重新利用键盘LED灯,让它们提供必要的反馈。
它还会记住每台电脑的LED状态,所以你可以准确地恢复到离开时的状态。
![图片]
如何构建
为了避免构建时的版本不匹配和报告的路径问题,同时也为了节省你下载大型SDK的麻烦,该项目现在捆绑了最小的pico sdk和tinyusb。
在Debian/Ubuntu系统上,请确保安装以下内容:
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential
你应该可以通过运行以下命令来构建:
cmake -S . -B build
cmake --build build
此外,要重新构建web UI,请查看webconfig/并执行./render.py
,你需要安装jinja2。
要重新构建磁盘,请查看disk/文件夹并运行./create.sh
,根据需要调整你的系统。你需要dosfstools(提供mkdosfs)。
使用预构建镜像
或者,你可以使用预构建镜像。从0.6版本开始,只有一个通用镜像。你需要.uf2文件,只需通过以下方式之一将其复制到设备即可:
升级固件
选项1 - (固件0.6及更高版本)通过同时按下左Shift + 右Shift + C + O将设备置于"配置模式"。你的键盘所连接的设备将重启并变成一个名为"DESKHOP"的USB驱动器。你只需将.uf2文件复制到其中即可。一旦镜像验证完毕,设备将闪存并重启,然后继续升级另一块板。在此操作期间,LED灯将闪烁。完成后,它将写入闪存并重启,完成操作。
注意 - 这不是一个真正的通用USB驱动器,你不能用它来复制文件。
选项2 - 使用ROM引导加载程序 - 连接每个Pico时按住板载按钮,并将uf2复制到出现的闪存驱动器中。0.6版本以后的镜像支持按住按钮而无需摆弄电源,但无论设备状态如何,"插入时按住按钮"的方法应该始终有效。
其他功能
鼠标减速
你是否曾试图将YouTube视频滑块移动到特定位置,但发现鼠标移动太跳跃,突然间你像5岁玩"手术"游戏一样小心翼翼地移动手?
按右CTRL + 右ALT可以切换慢速鼠标模式。鼠标指针会大幅减速,让你能够完成更精细的精确工作,再次快速按下相同的键即可恢复鼠标正常移动。
切换锁定
如果你想锁定在一个屏幕上,使用右CTRL + K
。
这将确保你不会意外离开当前屏幕。要关闭,再次按下相同的组合键。
锁定两个屏幕
你可以通过使用右CTRL + L
同时锁定两台电脑。
要使用此功能,请首先在配置中为每个输出设置操作系统(因为快捷键不同)。
屏幕保护程序
据说是为了防止计算机进入待机状态而内置的,但老实说 - 它只是看起来很有趣。默认关闭,会让你的鼠标指针像乒乓球一样在屏幕上弹来弹去。启用后,它会在用户配置头文件中定义的一段不活动时间后激活,并在你向该屏幕发送任何输出时自动关闭。
潜在用途示例 - 我有一个有问题的USB扩展坞,从待机状态恢复视频时会出错,所以不让它进入睡眠状态可能是一个方便的解决方法。
硬件
电路基于两块Raspberry Pi Pico板,之所以选择它们是因为它们便宜(4.10欧元/块),可以手工焊接,而且大多数供应商都有库存。
Pico通过UART连接,并由Analog Devices ADuM1201双通道数字隔离器(~3欧元)或更便宜、更快且引脚兼容的TI ISO7721DR(~1.5欧元)分隔,后者是首选。
虽然它们通常不支持双USB,但多亏了一个令人惊叹的项目,其中使用RP2040中的可编程IO实现了USB,因此支持它同时作为USB主机和设备。
PCB [更新]
为了让DIY构建尽可能简单,走线被保持在一侧,零件数量也保持在最少。
![图片]
USB D+/D-差分线的长度应该相同,但它们故意略微不对称,以抵消PICO PCB本身相应GPIO走线的长度差异,因此整体长度应该匹配。
Zd(差分阻抗)目标为90欧姆(设法达到了~107,已经足够接近:))。
厚度设计为1.6毫米,以使卡扣正常工作。
PCB有两个版本(对用户来说没有重大区别)。原始版本(v1.0)更容易焊接和组装,而v1.1提供了一些升级,如:
- 添加了ESD保护(TPD4E1U06DBVR)
- 为键盘/鼠标连接器添加了VBUS电容
- 丝印方向标记
- 为预先焊接接头的克隆板和更容易对齐添加了孔
- USB 27欧姆电阻
由于小型瞬态电压抑制器IC和0805电阻,这个版本稍微难以手工焊接,但完全可以做到。理论上可以省略TVS(不建议),它仍然可以工作。
即将推出 - 使用裸露rp2040的板,不需要Pico,更小巧方便。
外壳
由于我不太擅长3D,所以外壳简单基础但能完成任务。它应该很容易打印,使用约33克的细丝,需要几个小时。
PCB的水平移动由滑入孔中的销钉抵消,垂直移动由侧面的卡扣凸耳抵消 - 无需螺丝。外壳经过轻微重新设计,增加了logo和两个额外的卡扣凸耳,提供更好的密封。
两块板上的Micro USB连接器与外壳侧面偏移,因此稍大的孔应该允许电缆伸入。
盖子采用卡扣设计,带有用于打开的螺丝刀槽。顶部的标记是凹进去的,可以用蜡笔等完成以提供更好的对比度(或者简单地保持原样)。
![图片]
材料清单
点击此处查看原始PCB v1.0 BOM
| 组件 | 数量 | 单价 / € | 总价 / € | |-------------------|------|---------|----------| | 树莓派 Pico | 2 | 4.10 | 8.20 | | ADuM1201BRZ | 1 | 2.59 | 2.59 | | 1206 SMD 100nF 电容| 2 | 0.09 | 0.18 | | USB-A PCB 连接器 | 2 | 0.20 | 0.40 | | 2.54mm 1x03 排针 | 2 | 0.08 | 0.16 | | | | | | | | | 总计 | 11.53 |可以用 TI ISO7721DR 替代 ADuM - 它是引脚兼容的,价格更便宜,规格更好。
PCB v1.1
组件 | 型号 | 数量 | 单价 / € | 总价 / € |
---|---|---|---|---|
U1, U2 | 树莓派 Pico | 2 | 4.10 | 8.20 |
J1, J4 | USB-A PCB 连接器 | 2 | 0.20 | 0.40 |
U4 | TI ISO7721DR | 1 | 1.40 | 1.40 |
(或 ADuM1201BRZ) | ||||
C1, C2 | 0805 SMD 100nF 电容 | 2 | 0.09 | 0.18 |
R1, R2, R3, R4 | 0805 SMD 27欧姆电阻 | 4 | 0.03 | 0.12 |
U3, U5 | TPD4E1U06DBVR | 2 | 0.31 | 0.62 |
C3, C4 | 0805 SMD 4.7uF 电容 | 2 | 0.07 | 0.14 |
J2, J3 | 2.54mm 1x03 排针 | 2 | 0.08 | 0.16 |
总计 | 11.22 |
USB-A 连接器可以使用 Molex MX-67643-0910 或具有相同尺寸的更便宜/经济型号。
额外步骤:
组装指南
如果你有电子产品经验,你不需要这个。但是,如果你没有经验,这个视频可能会帮助你完成整个过程。请注意,焊接后应清洁 PCB 上的助焊剂以防止腐蚀。
标准的清洁方法是使用异丙醇和旧牙刷。但是猜猜怎么着?我不会把我的旧牙刷放到网上,所以你只能自己想办法了 :)
[注意] 视频组装指南涵盖了 PCB v1.0。修订版本非常相似,程序基本相同。
使用指南
键盘快捷键 -(固件版本 0.6+)
配置
左 Shift + 右 Shift + C + O
- 进入配置模式右 Shift + F12 + D
- 删除闪存配置右 Shift + F12 + Y
- 保存屏幕切换偏移右 Shift + F12 + S
- 开启/关闭屏保选项
使用
右 CTRL + 右 ALT
- 切换慢速鼠标模式右 CTRL + K
- 锁定/解锁鼠标桌面切换右 CTRL + L
- 同时锁定两个输出(先设置输出操作系统,见下方快捷键)Caps Lock
- 在输出之间切换
光标高度校准
这一步不是必需的,但如果你的屏幕没有完美对齐或大小不同,它会很有用。目的是让鼠标指针在完全相同的高度出现。
只需将鼠标停在较大屏幕上较小/较低屏幕的高度处(如图所示),然后按 右 Shift + F12 + Y
。你的 LED(和大写锁定)应该闪烁以确认。
对底部边框重复此操作(如果它高于较大屏幕的边框)。这将保存到闪存中,从此应该保持这个校准值。
每个输出多个屏幕
Windows 和 Mac 在多个屏幕和绝对定位方面存在问题,因此需要解决方法(仍在实验中)。正在开发更好的解决方案,但目前你必须为每个输出设置操作系统和屏幕数量。
你的主屏幕需要在中间,副屏幕在边缘。要配置实际选项,请打开设备的网页配置页面。
网页配置模式
从固件 0.6 开始,引入了改进的配置模式。要配置你的设备,请按以下说明操作:
- 按下左 Shift + 右 Shift + C + O - 你的设备将重启并进入配置模式(在键盘插入的那一侧)。LED 将在配置会话期间持续闪烁。
- 将出现一个名为 "DESKHOP" 的新 USB 驱动器,其中只有一个文件 config.htm
- 用 Chromium / Chrome 打开该文件。不幸的是,FF 目前不支持,因为他们避免实现 WebHID。
- 点击连接并允许 deskhop 设备配对。
- 根据需要配置选项,然后点击保存以写入设备。
- 点击菜单中的"退出"以离开配置模式,以增加安全性。
问:为什么不像 Via 那样简单地创建一个漂亮的在线网页,而要处理这种奇怪的 USB 驱动器方式? 答:从随机在线位置加载与输入设备交互的 JavaScript 存在潜在的安全风险。配置网页仅限本地,从不从外部加载任何内容。
请注意,配置网页之所以"奇怪"并非是故意混淆 - 它是由于存储空间非常有限而自解压缩的。整个源代码 100% 开放,是本仓库的一部分。我鼓励你自己重新构建所有内容。
功能验证
当你连接新的 USB 外设时,主板将闪烁 LED 两次,并指示另一个主板也这样做。这样你就可以测试每个主板的 USB 和输出通信是否正常。
通过先在一侧插入键盘,然后在另一侧插入来进行此测试。如果一切正常,LED 将在两种情况下快速来回闪烁。
安全性
某些功能是故意缺失的,尽管它们会使设备更易于使用或配置更简单。以下是这些决定的简要说明:
- 系统之间没有复制粘贴或任何信息共享。这可防止信息泄漏。
- 没有用户明确同意的 webhid 设备管理。除了标准键盘 LED 开/关消息并严格限制为 1 字节数据外,没有来自输出计算机的入站连接。
- 不从输出触发固件升级。只有通过特殊键盘快捷键的明确和故意的用户操作才能实现。
- 不暴露插入的键盘/鼠标的自定义端点或向这些设备转发信息。它们的潜在漏洞被有效地与计算机隔离。
- 不允许保留输入历史记录。
- 出于任何原因,设备都不会主动发起按键。唯一输出的是你输入/触发的内容。
- 输出在物理上是分开的,并通过最小 2kV 隔离电压进行电气隔离。
- 设备之间交换的数据包长度固定,转移的配置选项限于简短列表。大多数选项是只读的。可以禁用跨设备固件升级。
- 没有蓝牙或 WiFi、网络、互联网访问等。
- 在任何情况下都不认为连接的计算机是可信的。
- 一段时间不活动后自动禁用配置模式。
- 代码完全开源,没有任何二进制 blob,并有详细注释解释其用途。我鼓励你永远不要相信任何人,通过手动审核始终确保你知道你在运行什么。
这仍然不能保证任何事情,但我相信它提供了一套合理的基本规则来保护你的安全。
常见问题
- 我只有两个 Pico,可以不用 PCB 和隔离器吗?
当然可以。建议使用隔离器,但不用也应该能工作。
- 如果我的显示器分辨率不同会怎样?
鼠标移动是在抽象坐标空间中完成的,你的计算机会确定它如何对应物理屏幕,所以应该可以正常工作。 3. 我在哪里可以买到它?
我并不销售任何东西,这只是一个个人的非商业爱好项目。
[更新] 看起来你可以在Elecrow通过此链接单件订购(PCB、组装好的PCB或完全组装好的设备)
[更新2] - 我从未向Elecrow要求过任何东西,但几天前他们主动提供了一笔小预算来赞助项目,用于未来的电路板原型制作。由于我的目标是创建一个更好的板子,支持2个以上的输出等,我认为原型制作服务可能对项目有益。
- 当通过鼠标改变活动屏幕时,键盘是否会跟随(反之亦然)?
是的,设计理念是让它表现得像一台单一的计算机。
- 这能与键盘/鼠标组合接收器一起使用吗,比如罗技Unifying接收器?
应该可以。经过最近的固件更新,对组合接收器的支持应该好多了。
- 这能与使用单独无线接收器的无线鼠标和键盘一起使用吗(一个用于鼠标,另一个用于键盘)?
应该可以 - 我尝试过一个带单独接收器的Anker无线鼠标,工作正常。
- 我在构建或编译时遇到问题
查看故障排除Wiki,那里可能有一些答案。
软件替代方案
如果适合你的特定情况,有几种软件替代方案可以使用。
- Barrier - 免费,开源
- Input Leap - 免费,开源
- Synergy - 商业软件
- Mouse Without Borders - 免费,仅限Windows
- Universal Control - 免费,苹果生态
缺点
- Windows 10在KB5003637中破坏了HID绝对坐标行为,所以在Windows上不能使用多于1个屏幕(鼠标会停留在主屏幕上)。目前有一个实验性的解决方法,更好的解决方案正在开发中。
- 代码需要清理,一些重构等。
- 未经过大量不同设备的测试,我不知道它如何与你的硬件配合。很有可能things不能开箱即用。
- 高级键盘(带旋钮、额外按钮或滑块)可能会遇到这些附加硬件无法工作的问题。
- 超现代的带300个按钮的鼠标可能会发现一些按钮不能按预期工作。
- 注意:两台计算机都需要连接并为USB供电才能工作(因为每块板都由它插入的计算机供电)。如今许多台式机和笔记本电脑即使关机也会提供电源。如果你需要在一块板完全断开的情况下运行,你应该可以使用USB集线器将键盘和鼠标都插到一个端口上。
- MacOS在使用多个屏幕时存在问题,最新固件提供了一个实验性的解决方法来修复这个问题。
进展
那么,为什么会有这么多热情呢?我简直不敢相信 - 请允许我感谢你们所有人!我从未想到一个简单的个人项目会引起如此大的兴趣,所以最初的功能相当基础(就像我的烹饪技能一样),主要覆盖了我自己的使用场景。请继续关注固件更新,这将带来更广泛的设备兼容性、更多功能和更少的错误。由于这是一个业余项目,我感谢你们理解我的时间限制,并承诺尽我所能做到最好。
计划中的功能:
- 更好的多屏Windows和macOS解决方法
- 透明/游戏模式
- 支持2个以上的输出
- 改进配置用户界面
- ...等等!
正在开发一个精简版本,只需一块Pico W板就能提供基本功能,进一步降低成本,让你即使没有额外硬件或PCB也能尝试。
鼠标轮询现在应该能达到1000 Hz(图表中的下降是因为我的手臂因所有的移动而疼痛 :-):
赞助/捐赠
我做这个项目不是为了盈利或任何其他原因,只是为了尝试通过创造一个更好的工作环境来帮助人们。
然而,我决定接受捐赠,但仅用于一个目的 - 购买一些带媒体键、按钮、NKRO和其他人报告有问题的奇怪功能的键盘/鼠标,以修复错误,改进项目状态,并提供更好的用户体验。
话虽如此,如果你想支持这个项目,可以使用这个链接:
请允许我感谢所有帮助过或考虑帮助的人,这已经帮助我扩展了对一系列设备的支持。非常感谢!
免责声明
我恳请任何尝试构建这个项目的人理解并承认,我不对任何伤害、损坏或其他后果负责。你的安全很重要,我鼓励你谨慎地接近这个项目,采取必要的预防措施,并在整个过程中承担个人责任。请不要触电、烧伤、压力过大或生气。玩得开心,享受吧!
祝切换愉快!