RobotJS package gives users ability to control mouse and keyboard of the desktop. In our demo, we will try to draw a circle in MS Paint by controlling mouse actions. Here we will be using version 0.47 of RobotJS.
Development Environment:
- JetBrains Webstorm
- NPM 5.5.1
We will start by creating a simple node application in WebStorm.
Installing RobotJS:
Enter following command in terminal:
npm install robotjs --save
WebStorm creates a lot of boilerplate for us.
Next, we will set a route in our app.js as ‘draw’ where we will be adding our actions to draw different types of shapes.
...
...
var index = require('./routes/index');
var users = require('./routes/users');
var draw = require('./routes/draw');
...
...
app.use('/', index);
app.use('/users', users);
app.use('/draw', draw);
...
...
Code language: PHP (php)
Next, we will create ‘draw.js’ file in ‘routes’ directory of the project.
We will be using the polar form of the circle ie.:
x = R * cosθ y = R * sinθ
for drawing the points of the circle by using angles ranging from 0-360.
Robot class provides following methods for keyboard and mouse events:
- robot.keyTap(“tab”, “alt”) -> Performs a single keypress (first argument is a key and second argument is a modifier).
- robot.getScreenSize() -> Returns the size of the desktop screen.
- robot.setMouseDelay(0) -> Sets the delay in milliseconds to sleep after a mouse event.
- robot.moveMouse(x, y) -> Moves mouse to x, y human like, with the mouse button up.
- robot.mouseClick(“left”, false) -> Clicks the mouse (first argument is the mouse key and second argument is for double key press).
The draw.js class is as below:
var express = require('express');
var robot = require("robotjs");
var router = express.Router();
router.get('/circle', function(req, res) {
robot.keyTap("tab", "alt");
var screenSize = robot.getScreenSize();
var height = screenSize.height;
var width = screenSize.width;
var centerX = width / 2;
var centerY = height / 2;
var radius = Math.min(width, height) / 5;
robot.setMouseDelay(0);
for (var angle = 0; angle < 360; angle += 0.25) {
var x = centerX + (radius * Math.cos(toDegrees(angle)));
var y = centerY + (radius * Math.sin(toDegrees(angle)));
robot.moveMouse(x, y);
robot.mouseClick("left", false);
}
res.send('Bot at work');
});
function toDegrees (angle) {
return angle * (180 / Math.PI);
}
module.exports = router;
Code language: JavaScript (javascript)