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