











今天终于提笔写点什么,好好介绍一下这个我倾注了不少心血的开源项目。如果你正在读这篇文章,那说明我们可能有一样的困扰——你也想让自己的桌面变得不一样。
其实就是觉得,桌面自定义工具嘛,都能给桌面带来一些独特性,正好没有项目叫这个名字就选它了。(不过后来发现它确实有点长了)
其实刚开始开发的时候,我是不太清楚它有什么过人之处的(羡慕老牌软件Rainmeter)完全凭着对C++/Qt/QML开发的兴趣。项目刚开始的介绍是“集美化与实用功能与一体的桌面自定义工具”,不过我后来发现,我其实并没有打算做这些(都把这些交给开发者用户了,插件里可以有这些功能),Uniquenium主程序只是提供了一个自由的舞台。不仅如此,插件里的QML文件也是可以给使用者自由修改的,于是我把前面的定语改成“高度自由”,这个软件就是给使用者一个自由的修改桌面的平台。
简单来说,Uniquenium 是一个桌面组件容器 + 插件框架。
你可以把它理解为一个"桌面的积木系统":主程序提供舞台,插件提供组件,你自由组合、自由摆放、自由定义。所有组件都是透明窗口,可以叠加在任何东西之上——桌面上、游戏旁边、浏览器角落,随你喜欢。
GitHub 项目地址:Uniquenium/Uniquenium
为了让所有插件都有一致而精美的外观,我先做了一套自己的控件体系。这不是一件容易的事,因为 Windows 上做自定义控件要考虑的细节太多了——DPI 缩放、主题切换、各种边缘 case……
目前控件库包括:
| 类别 | 控件 |
|---|---|
| 容器窗口 | UniDeskWindow、UniDeskDialog、UniDeskMessageBox |
| 基础交互 | UniDeskButton、UniDeskTextField、UniDeskTextArea、UniDeskCheckBox、UniDeskRadioButton |
| 选择控件 | UniDeskComboBox、UniDeskSpinBox、UniDeskSlider、UniDeskColorPicker、UniDeskFontBox |
| 菜单导航 | UniDeskMenu、UniDeskMenuItem、UniDeskTabBar、UniDeskTabButton |
| 展示控件 | UniDeskText、UniDeskImage、UniDeskIcon、UniDeskChart、UniDeskInfoBar |
| 高级效果 | UniDeskAcrylic(亚克力毛玻璃)、UniDeskShadow(阴影)、UniDeskFrame(框架) |
| 选择器 | UniDeskPosSelector、UniDeskSizeSelector、UniDeskPathSelector、UniDeskHotkeyPicker |
| 其他 | UniDeskAppBar、UniDeskTooltip、UniDeskComBox、UniDeskComRectEditor |
所有控件都原生支持浅色/深色主题,会跟随 Windows 系统设置自动切换。
在控件之上,我构建了组件系统(UniDeskComponentsData),这是整个应用的骨架:
插件是 Uniquenium 最核心的设计,也是我最满意的部分。
我希望插件开发尽可能简单,于是设计了基于 Qt 插件机制 + QML 动态加载的架构:
class UniDeskPluginInterface {
virtual void registerQmlTypes(QQmlApplicationEngine *engine) = 0;
virtual void initialize() = 0;
};每个插件只要实现这个接口,放在指定目录下,主程序就会自动加载它。插件可以:
pluginId 隔离)SignalHandler.qml)我还提供了一个完整的示例项目 uq-plugin-example,开发者可以直接照着改,开箱即用。
做桌面工具,自然离不开系统信息。我写了一个完整的系统信息采集模块(UniDeskSystemInfo),可以获取:
然后我基于 exprtk 库做了一个表达式引擎(UniDeskExpr),让你可以在组件里直接用 %cpuPercent 这样的变量来引用系统数据,也支持解析 API 返回的 JSON 响应。这样你就能做出实时监控面板之类的东西。
壁纸部分(UniDeskCustomWallpaper)我做了三种模式:
核心难点在于透明窗口穿透,我通过 Windows API 实现了真正的桌面级嵌入,让组件和壁纸真正融合在一起。
为了让用户能方便地分享和复用桌面配置,我做了主题管理(UniDeskThemeManager)和模板管理(UniDeskTempleteMgr):
通过 QHotkey 库实现了全局热键(UniDeskHotkey),你可以为设置面板、页面管理器等绑定任意快捷键组合。
光标方面(UniDeskCursorManager),支持加载整套自定义光标主题,会自动保存/恢复系统原始光标,卸载时无缝还原。
主程序只是一个框架,真正的灵魂在于插件。我做了一个官方插件包(OfficialPlugin),里面包含了几个实用组件,开箱即用。
这是我个人最喜欢的组件之一。它通过 Windows 全局钩子捕获系统级的键盘和鼠标事件,然后以胶囊动画的形式显示在屏幕上——按键按下时立即出现,释放后延时淡出。
想象一下你录视频时,它能帮你实时展示按了哪些键;或者你只是想炫一下你的桌面,它也是个很酷的装饰。
一个完整的桌面待办管理器:增删改查、三种过滤视图(全部/未完成/已完成)、实时统计完成进度、内联编辑、自动保存。小巧但功能齐全。
基于 Windows WASAPI 接口实时捕获系统音频,做 FFT 频谱分析,然后用平滑的动画展示音频波形。频段数量、颜色、平滑度全部可配置,开着它听歌非常享受。
一个真正实用的实时数据可视化组件。支持两种数据源:
%cpuPercent、%memoryUsed 这类系统变量基于 QML Canvas 绘制,支持网格线、时间轴标注、数据点缓存等。想做一个实时监控面板?直接用它。
一个给博主用的组件。直连 MongoDB,实时展示你博客的 Twikoo 评论系统的评论。支持按页面 URL 过滤、完整的回复链展示、一键测试连接。让你的桌面能看到读者的留言。
Uniquenium 是一个我抱着"做一个自己真正想用的工具"的心态开始的项目。它还在持续成长中,有很多想法正在逐步实现——比如更丰富的组件类型、更完善的插件生态、以及我一直在构思的模板系统。
如果你读完这篇文章觉得"嗯,这个东西有点意思",欢迎去 GitHub 看看,点个 star 支持一下。如果你有想法、建议或者想贡献代码,Issues 和 Pull Request 都非常欢迎。
从零开始,打造属于自己的桌面 —— Uniquenium 开发手记
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。