Electron聊天工具

62 阅读1分钟

背景

销售或客服在使用微信或者企微与用户沟通的时候,经常需要发送一些重复的语录或者图片等,因此需要一款“流氓软件”能粘着微信/企微窗口,点击即可快速粘贴内容到输入框或直接发送内容;

实现

1. 获取窗口位置

const ffi = require('ffi-napi');

const getScreen = (winName) => {
  // 定义 Windows API 函数
  const user32 = ffi.Library('user32', {
    'FindWindowA': ['pointer', ['string', 'string']],
    'GetWindowRect': ['bool', ['pointer', 'pointer']]
  });

  // 查找窗口句柄
  const windowHandle = user32.FindWindowA(null, winName);

  if (windowHandle.isNull()) {
    // 未找到窗口
    return {}
  } else {
    // 获取窗口的位置和大小
    const rect = Buffer.alloc(16); // RECT 结构体大小为 16 字节
    user32.GetWindowRect(windowHandle, rect);

    // 解析 RECT 结构体
    const left = rect.readInt32LE(0);
    const top = rect.readInt32LE(4);
    const right = rect.readInt32LE(8);
    const bottom = rect.readInt32LE(12);

    return {
      x: left,
      y: top,
      width: right - left,
      height: bottom - top,
    }
  }
}

2. 复制文本

function copyToClipboard(value) {
  const oInput = document.createElement('textarea');
  oInput.value = value;
  document.body.appendChild(oInput);
  oInput.select(); // 选择对象
  document.execCommand('Copy'); // 执行浏览器复制命令
  oInput.className = 'oInput';
  oInput.style.display = 'none';
}

3. 聚焦到输入框热区

通过计算大概获取输入框的位置,并通过robotjs控制键鼠位置进行快速操作;

或许有wxwork://这种协议能直接focus到输入框,或者直接发送内容(可以优化下);

const robot = require('robotjs');

const setMsg = () => {
  // 上一步骤获取到的位置以及大小
  const {x, y, width, height} = screen;
  // 鼠标目前的位置(执行完需要还原鼠标的位置)
  const oldPos = robot.getMousePos();
  // TODO ===> 这个位置计算需要深度优化下
  const targetX = x + 350;
  const targetY = y + height - 60;
  // 移动鼠标至上面计算好的位置
  robot.moveMouse(targetX, targetY);
  // 点击鼠标左键
  robot.mouseClick();
  // 执行键盘的粘贴快捷键
  robot.keyTap('v', ['control']);
  // 还原鼠标位置
  robot.moveMouse(oldPos.x, oldPos.y);
}