RobotJS核心功能全解析:鼠标控制篇
【免费下载链接】robotjs Node.js Desktop Automation. 项目地址: https://gitcode.com/gh_mirrors/ro/robotjs
你是否曾需要自动化重复的鼠标操作?比如游戏辅助、数据录入或UI测试?RobotJS(Robot JavaScript)作为Node.js桌面自动化库,提供了简洁API实现精准鼠标控制。本文将系统讲解其鼠标控制核心功能,从基础移动到高级拖拽,结合代码示例与实现原理,助你快速掌握自动化控制技巧。
环境准备与基础架构
使用RobotJS前需通过npm安装:
npm install git+https://gitcode.com/gh_mirrors/ro/robotjs.git
核心实现位于src/mouse.c和src/mouse.h,采用跨平台架构设计,通过条件编译适配macOS、Windows和Linux系统。JavaScript层API定义在index.js,封装C++扩展模块robotjs.node提供统一调用接口。
鼠标定位系统
坐标体系
RobotJS采用屏幕像素坐标系,原点(0,0)位于左上角,X轴向右递增,Y轴向下递增。不同平台通过各自系统API获取屏幕尺寸:
- Windows:
GetSystemMetrics(SM_CXVIRTUALSCREEN) - macOS:
CGDisplayBounds(CGMainDisplayID()) - Linux(X11):
XGetGeometry()
核心定位API
// 获取当前鼠标位置
const pos = robot.getMousePos();
console.log(`当前位置: (${pos.x}, ${pos.y})`);
// 移动鼠标到指定坐标
robot.moveMouse(100, 200);
// 平滑移动(带物理曲线)
robot.moveMouseSmooth(500, 300, { duration: 1.5 }); // 1.5秒内平滑移动
src/mouse.c中smoothlyMoveMouse()函数实现了物理运动模拟,通过重力加速度算法生成自然移动轨迹,代码片段:
// 简化的平滑移动算法
while (distance > 1.0) {
double gravity = DEADBEEF_UNIFORM(5.0, 500.0);
velo_x += (gravity * (endPoint.x - pos.x)) / distance;
velo_y += (gravity * (endPoint.y - pos.y)) / distance;
// ... 轨迹计算与移动
microsleep(DEADBEEF_UNIFORM(0.7, speed));
}
鼠标按键控制
按键常量定义
src/mouse.h定义了跨平台的鼠标按键枚举:
// Windows/Linux按键定义
enum _MMMouseButton {
LEFT_BUTTON = 1, // 左键
CENTER_BUTTON = 2, // 中键(滚轮)
RIGHT_BUTTON = 3 // 右键
};
基础点击操作
// 左键单击
robot.mouseClick();
// 右键单击
robot.mouseClick('right');
// 中键单击
robot.mouseClick('center');
// 双击操作
robot.mouseClick('left', true); // 第二个参数为doubleClick标志
点击实现位于src/mouse.c的clickMouse()函数:
void clickMouse(MMMouseButton button) {
toggleMouse(true, button); // 按下
toggleMouse(false, button); // 释放
}
高级按键控制
// 按下鼠标左键
robot.mouseToggle('down');
// 拖拽操作
robot.moveMouse(100, 200); // 移动到起始点
robot.mouseToggle('down'); // 按下左键
robot.moveMouse(300, 400); // 移动到目标点
robot.mouseToggle('up'); // 释放左键
滚轮控制
垂直与水平滚动
// 向上滚动(正值)
robot.scrollMouse(0, 10);
// 向下滚动(负值)
robot.scrollMouse(0, -10);
// 水平滚动(Windows/Linux)
robot.scrollMouse(5, 0); // 向右
robot.scrollMouse(-5, 0); // 向左
实现原理
不同平台通过不同机制实现滚动:
- Windows:
MOUSEEVENTF_WHEEL和MOUSEEVENTF_HWHEEL标志 - macOS:
CGEventCreateScrollWheelEvent() - Linux(X11):模拟鼠标4-7号按键事件
src/mouse.c中scrollMouse()函数根据平台生成对应事件,X11实现示例:
// Linux滚动实现(简化)
int ydir = (y < 0) ? 5 : 4; // 4=上滚,5=下滚
for (int yi = 0; yi < abs(y); yi++) {
XTestFakeButtonEvent(display, ydir, 1, CurrentTime); // 按下
XTestFakeButtonEvent(display, ydir, 0, CurrentTime); // 释放
}
实战应用案例
自动化表单填写
// 假设表单字段坐标已知
const fields = [
{ x: 200, y: 300, text: 'username' },
{ x: 200, y: 350, text: 'password' }
];
// 依次点击并输入内容
fields.forEach(field => {
robot.moveMouseSmooth(field.x, field.y);
robot.mouseClick();
robot.typeString(field.text);
});
游戏辅助自动采集
// 循环点击屏幕上的目标点
function autoCollect(targets) {
while (true) {
targets.forEach(target => {
robot.moveMouseSmooth(target.x, target.y);
robot.mouseClick('left', false);
robot.setMouseDelay(200); // 点击间隔200ms
});
robot.setMouseDelay(5000); // 一轮采集间隔5秒
}
}
// 启动采集(示例坐标)
autoCollect([
{ x: 400, y: 450 },
{ x: 600, y: 500 },
{ x: 800, y: 450 }
]);
性能优化与注意事项
延迟控制
// 设置移动延迟(毫秒)
robot.setMouseDelay(100);
// 设置双击间隔
robot.setMouseClickDelay(50);
跨平台兼容性
- Windows:管理员权限可能导致坐标偏移
- macOS:需要 accessibility权限(系统偏好设置→安全性与隐私)
- Linux:需要X11测试扩展(
xserver-xorg-input-test)
错误处理
try {
robot.moveMouse(2000, 2000); // 超出屏幕范围
} catch (e) {
console.error('操作失败:', e.message);
}
总结与扩展阅读
本文详细讲解了RobotJS鼠标控制的核心功能,包括定位系统、按键操作和滚轮控制,结合跨平台实现原理与实战案例。完整API文档可参考项目README.md,更多高级功能如屏幕捕获、颜色识别可查阅对应模块实现。
后续计划推出《键盘控制篇》和《屏幕捕获篇》,敬请关注。如有问题或建议,欢迎提交issue参与项目改进。
学习资源:
- 官方示例:test/mouse.js
- 核心实现:src/mouse.c
- 类型定义:index.d.ts
【免费下载链接】robotjs Node.js Desktop Automation. 项目地址: https://gitcode.com/gh_mirrors/ro/robotjs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



