滚轮

滚轮是鼠标上极其常用的一个部件
(妙控鼠标:?)
偏偏滚轮又很容易坏
这不,刚换了个公司,鼠标滚轮没两天就坏了
看着小米mimo那个用不完的额度
一个想法冒出头来

整理一下

说干就干,让deepseek整理需求,
我们要的是一个全局的悬浮窗
他有向上向下两个箭头,点击向上就是滚轮往上
然后可以拖动位置
然后为了方便,再加一个中键摁住拖动
向上就是向上
(中键?哪来的中键?)
没错!滚轮是可以摁下去的,那个就是中键!
然后还要一个开机自启,再来一个滚动行数可配置
当然,一步到位直接覆盖3端
齐活,整理完了,让deepseek输出提示词
顺便起了个名字

提示词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
请帮我用 Flutter 开发一个桌面软件(同时支持 Windows、macOS、Linux)。

【软件名称】
轻舟 / Skiff

【核心功能】
鼠标滚轮坏了的时候,用来模拟滚轮滚动。

【功能一:悬浮双区域按钮】
一个圆角矩形的悬浮条,分成上下两个独立区域:

┌─────────┐
│ ▲ │ ← 点击向上滚动
├─────────┤
│ ▼ │ ← 点击向下滚动
└─────────┘

设计要求:
- 整体尺寸:宽50px,高80px,圆角12px
- 背景色:半透明深灰色(rgba(40,40,40,0.7))
- 鼠标悬停时背景变亮(rgba(60,60,60,0.8))
- 两个区域之间有细分割线
- 图标:上区域显示向上箭头(Icons.arrow_upward),下区域显示向下箭头(Icons.arrow_downward)
- 整体可拖拽移动位置
- 拖拽时不会误触发点击滚动

滚动行为:
- 每次点击滚动3行
- 滚动平滑自然

【功能二:中键手势滚动(新逻辑)】
操作方式:
1. 按住鼠标中键
2. 向上移动鼠标(移动距离超过阈值,例如20像素)
3. 松开中键 → 触发一次向上滚动
4. 同理,按住中键向下移动超过阈值 → 松开后触发一次向下滚动

注意:
- 是“移动+松开”触发一次滚动,不是连续滚动
- 需要设置移动距离阈值,避免轻微抖动就触发
- 移动未超过阈值就松开,不触发任何滚动
- 需要全局监听(软件在后台也能用)

【系统托盘】
- 软件启动后只在系统托盘显示图标,不显示主窗口
- 右键点击托盘图标弹出菜单:显示/隐藏悬浮按钮、退出软件
- 悬浮按钮默认显示在屏幕右下角
- 启动时默认显示悬浮按钮

【跨平台要求】
- 同时支持 Windows、macOS、Linux
- 打包成独立可执行文件,用户无需安装环境

【macOS特别说明】
- 需要辅助功能权限才能全局监听鼠标事件
- 请在代码中包含权限检测和引导申请

【技术实现建议】
- 悬浮窗口:使用 Overlay 或独立的无边框窗口(window_manager)
- 全局鼠标监听:mouse_listener 或 flutter_global_hotkey
- 模拟滚动:robotjs 或 native_toolchain_c
- 系统托盘:tray_manager
- 手势阈值判断:记录中键按下位置,松开时计算位移差

【代码要求】
- 提供完整的项目代码结构
- 包含所有必要的配置文件(pubspec.yaml、platform相关配置)
- 添加详细注释
- 提供打包命令说明

【兼容性说明】
- 滚轮模拟功能在所有场景下都能正常工作,包括:
- 浏览器中按住Ctrl+滚轮缩放图片/页面时
- 地图、设计软件、图片查看器等支持滚轮缩放的应用
- 游戏、远程桌面等
- 原理:模拟的是原生系统级滚轮事件,目标应用收到的是真实滚轮信号

【中键手势冲突处理】
- 按住中键→移动→松开 触发滚动的功能,可能与部分软件的中键原生功能冲突
- 冲突场景:Figma/Blender(中键拖拽平移)、浏览器(中键开新标签页)、IDE(中键多光标)
- 请添加一个托盘菜单开关:☑ 启用中键手势
- 默认开启,用户遇到冲突时可关闭,仅使用悬浮按钮

【实现建议】
- 模拟滚动使用 robotjs 的 scrollMouse 方法
- 中键手势监听时,注意判断当前焦点窗口,避免在特定应用中自动禁用(可选高级功能)

开干

建好项目,丢给小米
慢慢蹬吧
当然没可能一把出
遇到的问题有,点击页面不滚动
悬浮窗抢焦点,拖拽卡顿
中键没效果等等
特别是抢焦点这个,mimo来来回回改了8版解决不了
最后使用 X11 Input Shape Passthrough — 临时将悬浮窗的输入区域设为空,
让鼠标事件穿透到下层窗口
中键也是,一致检测不到
最后XQueryPointer 轮询,每 10ms 检查
因为一开始只设计了上下两个箭头,事件冲突,所以拖拽卡顿
最后再加了一个按钮专门负责拖拽
勉强凑合能用,
具体修改可以看仓库里的文档
最后写好自动构建,推送完事

使用

请前往仓库地址查看
不过我只测试了ubuntu,win和mac 大概率都是有问题
(逃~)