这两天打算做一个手机H5控制电脑的屏幕的小工具,已经做好了鼠标滑动的逻辑,还差鼠标点击、双击功能、键盘输入等的功能就不先都漏出来啦。
主要使用nodejs、robotjs、socket.io.js。
昨天写了一晚上的,终于把这个触控板逻辑写好了,发出来先显摆显摆~嘿嘿😋
基本逻辑
名词解释:
- 被控制电脑 === 服务端
- 触控板 === 客户端
1、当触控触摸板touchstart时,客户端获取当前触控板点击位置的坐标,并通知服务端获取当前鼠标位置的坐标;
2、当touchmove时,客户端获取当前手指所在的位置减去touchstart时的位置得到一个向量,把这个向量传递给服务端,服务端根据第一步获取的鼠标位置加这个向量得到新的鼠标位置。(就是一个映射~)
客户端触控板基本逻辑
const socket = io("http://172.19.133.243:8999/");
socket.on("connect", function () {
socket.emit("message", { x: 0, y: 0 });
});
const controllArea = $("#controllArea");
const bodyWidth = controllArea.width();
const bodyHeight = controllArea.height();
const offsetTop = controllArea[0].offsetTop;
// 1、客户端向服务端发送设备信息
socket.emit("deviceInfo", {
offsetTop: offsetTop,
width: bodyWidth,
height: bodyHeight,
});
let startX, startY;
let startTime;
// 3、触控开始向服务端发送信号
controllArea.on("touchstart", function (e) {
startTime = new Date().getTime();
startX = e.originalEvent.changedTouches[0].pageX;
startY = e.originalEvent.changedTouches[0].pageY;
socket.emit("touchstartMessage");
return false;
});
let moveEndX, moveEndY;
// 5、鼠标滑动向服务端发送一个基于触控开始的向量
controllArea.on("touchmove", function (e) {
const ev = e.originalEvent.changedTouches[0];
moveEndX = ev.clientX;
moveEndY = ev.clientY;
const X = moveEndX - startX;
const Y = moveEndY - startY;
const data = {};
data.x = X;
data.y = Y;
socket.emit("message", data);
return false;
});
服务端被控制电脑逻辑
socket.on("connection", function (client) {
// 被控制设备的尺寸
let computerInfoWidth;
let computerInfoHeight;
// 控制设备的控制区域尺寸
let controlDeviceInfoWidth;
let controlDeviceInfoHeight;
let offsetTop;
// 设备控制比例
const transformRate = {
x: 1,
y: 1,
offsetTop: 0,
};
// 获取控制设备的触控区域信息和被控制设备的尺寸信息,做触控灵敏度
// 3、服务端获取客户端发送的设备信息
client.on("deviceInfo", function (data) {
computerInfoWidth = robot.getScreenSize().width;
computerInfoHeight = robot.getScreenSize().height;
controlDeviceInfoWidth = data.width;
controlDeviceInfoHeight = data.height;
offsetTop = data.offsetTop;
transformRate.x = parseInt(computerInfoWidth / controlDeviceInfoWidth);
transformRate.y = parseInt(computerInfoHeight / controlDeviceInfoHeight);
transformRate.offsetTop = parseInt(offsetTop);
});
// 3、触摸开始获取当前鼠标在电脑上的位置
let mouse;
client.on("touchstartMessage", function () {
mouse = robot.getMousePos();
});
// 6、根据客户端发送的向量和滑动速率进行鼠标的移动
// 最大不大过服务端屏幕宽度,最小不小于0
client.on("message", function (data) {
try {
const posiX = Math.max(
Math.min(
parseInt(mouse.x + data.x * transformRate.x),
computerInfoWidth
),
0
);
const posiY = Math.max(
Math.min(
parseInt(mouse.y + data.y * transformRate.y),
computerInfoHeight
),
0
);
robot.moveMouse(parseInt(posiX), parseInt(posiY));
} catch (error) {
console.error("moveMouse error: ", error);
}
});
});