这两天打算做一个手机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、根据客户端发送的向量和滑动速率进行鼠标的移动// 最大不大过服务端屏幕宽度,最小不小于0client.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);}});});
