这两天打算做一个手机H5控制电脑的屏幕的小工具,已经做好了鼠标滑动的逻辑,还差鼠标点击、双击功能、键盘输入等的功能就不先都漏出来啦。
主要使用nodejs、robotjs、socket.io.js。
昨天写了一晚上的,终于把这个触控板逻辑写好了,发出来先显摆显摆~嘿嘿😋

基本逻辑

名词解释:

  • 被控制电脑 === 服务端
  • 触控板 === 客户端

1、当触控触摸板touchstart时,客户端获取当前触控板点击位置的坐标,并通知服务端获取当前鼠标位置的坐标;
2、当touchmove时,客户端获取当前手指所在的位置减去touchstart时的位置得到一个向量,把这个向量传递给服务端,服务端根据第一步获取的鼠标位置加这个向量得到新的鼠标位置。(就是一个映射~)

客户端触控板基本逻辑

  1. const socket = io("http://172.19.133.243:8999/");
  2. socket.on("connect", function () {
  3. socket.emit("message", { x: 0, y: 0 });
  4. });
  5. const controllArea = $("#controllArea");
  6. const bodyWidth = controllArea.width();
  7. const bodyHeight = controllArea.height();
  8. const offsetTop = controllArea[0].offsetTop;
  9. // 1、客户端向服务端发送设备信息
  10. socket.emit("deviceInfo", {
  11. offsetTop: offsetTop,
  12. width: bodyWidth,
  13. height: bodyHeight,
  14. });
  15. let startX, startY;
  16. let startTime;
  17. // 3、触控开始向服务端发送信号
  18. controllArea.on("touchstart", function (e) {
  19. startTime = new Date().getTime();
  20. startX = e.originalEvent.changedTouches[0].pageX;
  21. startY = e.originalEvent.changedTouches[0].pageY;
  22. socket.emit("touchstartMessage");
  23. return false;
  24. });
  25. let moveEndX, moveEndY;
  26. // 5、鼠标滑动向服务端发送一个基于触控开始的向量
  27. controllArea.on("touchmove", function (e) {
  28. const ev = e.originalEvent.changedTouches[0];
  29. moveEndX = ev.clientX;
  30. moveEndY = ev.clientY;
  31. const X = moveEndX - startX;
  32. const Y = moveEndY - startY;
  33. const data = {};
  34. data.x = X;
  35. data.y = Y;
  36. socket.emit("message", data);
  37. return false;
  38. });

服务端被控制电脑逻辑

  1. socket.on("connection", function (client) {
  2. // 被控制设备的尺寸
  3. let computerInfoWidth;
  4. let computerInfoHeight;
  5. // 控制设备的控制区域尺寸
  6. let controlDeviceInfoWidth;
  7. let controlDeviceInfoHeight;
  8. let offsetTop;
  9. // 设备控制比例
  10. const transformRate = {
  11. x: 1,
  12. y: 1,
  13. offsetTop: 0,
  14. };
  15. // 获取控制设备的触控区域信息和被控制设备的尺寸信息,做触控灵敏度
  16. // 3、服务端获取客户端发送的设备信息
  17. client.on("deviceInfo", function (data) {
  18. computerInfoWidth = robot.getScreenSize().width;
  19. computerInfoHeight = robot.getScreenSize().height;
  20. controlDeviceInfoWidth = data.width;
  21. controlDeviceInfoHeight = data.height;
  22. offsetTop = data.offsetTop;
  23. transformRate.x = parseInt(computerInfoWidth / controlDeviceInfoWidth);
  24. transformRate.y = parseInt(computerInfoHeight / controlDeviceInfoHeight);
  25. transformRate.offsetTop = parseInt(offsetTop);
  26. });
  27. // 3、触摸开始获取当前鼠标在电脑上的位置
  28. let mouse;
  29. client.on("touchstartMessage", function () {
  30. mouse = robot.getMousePos();
  31. });
  32. // 6、根据客户端发送的向量和滑动速率进行鼠标的移动
  33. // 最大不大过服务端屏幕宽度,最小不小于0
  34. client.on("message", function (data) {
  35. try {
  36. const posiX = Math.max(
  37. Math.min(
  38. parseInt(mouse.x + data.x * transformRate.x),
  39. computerInfoWidth
  40. ),
  41. 0
  42. );
  43. const posiY = Math.max(
  44. Math.min(
  45. parseInt(mouse.y + data.y * transformRate.y),
  46. computerInfoHeight
  47. ),
  48. 0
  49. );
  50. robot.moveMouse(parseInt(posiX), parseInt(posiY));
  51. } catch (error) {
  52. console.error("moveMouse error: ", error);
  53. }
  54. });
  55. });