老北逗的开发笔记 NOTES ON BUILDING SMALL THINGS

桌面挂件怎么做才不烦人

2026-10-12 · 桌面开发

桌面挂件的第一原则不是"好看",是**不打扰**。用户装着它,然后忘掉它, 但想起来的时候它一直都在。这条原则会反过来决定技术方案。

一、点击必须穿透

挂件浮在桌面最上层,如果它吃掉鼠标点击,用户点自己桌面就会被挡住。 做法是用 Electron 的 setIgnoreMouseEvents(true, { forward: true }), 让窗口变成透明的"洞",鼠标下面该点什么都正常。

但反过来,用户又需要能点到核桃(左键盘它、右键打开收藏柜)。 所以要根据光标位置动态切换:

// 光标在核桃上 → 可点;不在 → 穿透
const over = hitTest(cursorX, cursorY);
win.setIgnoreMouseEvents(!over, { forward: true });

这里有个细节:两个核桃之间的缝隙也要算作可点区域, 否则中间会留一条几像素的"死缝",右键会漏到桌面上。

二、不用管理员权限

很多桌面挂件要读全局鼠标,就直接上驱动或者申请提权。这对用户是很大的心理负担, 而且很容易被杀软拦。

我用的两个普通权限方案:

键盘一个键都不读。少读一类输入,就少一类安全风险,也少一堆解释成本。

三、空闲时几乎不渲染

挂件会一直开着。如果它以 60 fps 渲染,笔记本电池会明显受影响。 现在的策略:

最后一招很有效:把"这一帧要画什么"量化成一个字符串签名, 和上一帧相同就不渲染。实测空闲 CPU 从几个百分点降到 1% 左右。

四、数据只留在本地

挂件记录的是鼠标活动,这类数据很敏感。所以从一开始就没做账号、没做上传、没做遥测。 存档就是一个 JSON 文件,用户可以自己打开看,也可以直接删掉。

五、卸载要干净

绿色版是我最后选的分发方式:解压即用,数据放在程序旁边的 PantaData 目录, 删掉文件夹就彻底干净。没有注册表、没有系统目录残留。

另外,卸载时**不要删用户的存档**——那是几个月攒出来的东西。 重装应该是"接着养",不是"从头开始"。

相关项目:盘它