问题根源
在 Windows 10/11 系统上,RobotJS 0.6.0 的 scrollMouse 方法存在一个已知 Bug ,可能会导致滚动完全失效。
原代码在 Windows 上会同时发送水平和垂直两个 SendInput 事件,导致系统无法正确处理。
解决方案
需要手动修改 node_modules\robotjs\src\mouse.c 文件,将同时发送改为分别发送每个方向的滚动事件。
要改的地方在 scrollMouse(int x, int y) 函数里的 Windows 分支,也就是你贴的代码最后这一段:
c
#elif defined(IS_WINDOWS)
mouseScrollInputs[0].type = INPUT_MOUSE;
// ...
mouseScrollInputs[1].type = INPUT_MOUSE;
// ...
SendInput(2, mouseScrollInputs, sizeof(mouseScrollInputs));
#endif
问题就在最后这一行:
c
SendInput(2, mouseScrollInputs, sizeof(mouseScrollInputs));
它一次性把"水平滚动"和"垂直滚动"两个鼠标输入一起提交,Windows 下容易导致滚轮事件失效或被吞掉。
最小修改
把最后这一行:
c
SendInput(2, mouseScrollInputs, sizeof(mouseScrollInputs));
改成两次单独发送:
c
SendInput(1, &mouseScrollInputs[1], sizeof(INPUT)); // 垂直滚轮
SendInput(1, &mouseScrollInputs[0], sizeof(INPUT)); // 水平滚轮
也就是先发垂直,再发水平。这样 Windows 才能正确识别滚轮。
修改后重新编译
改完 mouse.c 后,预编译的 .node 文件不会自动生效,需要重新编译:
bash
npm rebuild robotjs
或者在 node_modules/robotjs 目录下:
bash
npx node-gyp rebuild
然后再运行你的 JS 代码测试:
javascript
const robot = require("robotjs");
robot.moveMouse(500, 300);
robot.scrollMouse(0, -120); // 向下滚动 步长至少120左右,太小会被 Windows 忽略
如果是在 Windows 下,改这里基本就是解决 scrollMouse 不生效的关键。
注意:如果滚动步长设置的值过小,会被Windows 忽略不生效