iohook
依赖太麻烦了,不是重新编译就是降级。我觉得我hold不住。
发现了这个:
在Electron主进程中使用uiohook-napi
插件需要结合Electron的主进程生命周期和原生模块特性。
主要也是通过手动编译原生模块:npx electron-rebuild -f -w uiohook-napi
或者是在package.json中设置
"scripts": {
"start": "electron .",
"serve": "vue-cli-service serve",
"build": "vite build",
"rebuild": "electron-rebuild -f -w uiohook-napi"
},
然后执行npm run rebuild即可,正常显示结果如下
C:\Users\volvo\Desktop\electronExercise\electron-app> npm run rebuild
> [email protected] rebuild
> electron-rebuild -f -w uiohook-napi
| Building module: robotjs, Completed: 0(node:8072) [DEP0060] DeprecationWarning: The `util._extend` API is deprecated. Please use Object.assign() instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
\ Building module: robotjs, Completed: 0在此解决方案中一次生成一个项目。若要启用并行生成,请添加“-m”开关。
| Building module: robotjs, Completed: 0 robotjs.cc
/ Building module: robotjs, Completed: 0C:\Users\volvo\Desktop\electronExercise\electron-app\node_modules\robotjs\src\os.h(26,1): warning C4005: “STRICT”: 宏重定义 [C:\Users\volvo\Desktop\electronExercise\electr
on-app\node_modules\robotjs\build\robotjs.vcxproj]
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\minwindef.h(23): message : 参见“STRICT”的前一个定义 [C:\Users\volvo\Desktop\electronExercise\electron-app\no
de_modules\robotjs\build\robotjs.vcxproj]
- Building module: robotjs, Completed: 0 deadbeef_rand.c
\ Building module: robotjs, Completed: 0 mouse.c
- Building module: robotjs, Completed: 0 keypress.c
- Building module: robotjs, Completed: 0 keycode.c
| Building module: robotjs, Completed: 0 screen.c
- Building module: robotjs, Completed: 0 screengrab.c
/ Building module: robotjs, Completed: 0 snprintf.c
\ Building module: robotjs, Completed: 0 MMBitmap.c
/ Building module: robotjs, Completed: 0 win_delay_load_hook.cc
- Building module: robotjs, Completed: 0 正在生成代码
Previous IPDB not found, fall back to full compilation.
- Building module: robotjs, Completed: 0 All 244 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
| Building module: robotjs, Completed: 0 robotjs.vcxproj -> C:\Users\volvo\Desktop\electronExercise\electron-app\node_modules\robotjs\build\Release\\robotjs.node
√ Rebuild Complete
PS C:\Users\volvo\Desktop\electronExercise\electron-app> npm start
以下是完整的集成步骤和注意事项:
一、环境准备与安装
安装依赖
在Electron项目中,需将uiohook-napi
安装为主进程依赖,并确保安装electron-rebuild
处理原生模块编译:npm install uiohook-napi --save npm install electron-rebuild --save-dev
配置Electron Rebuild
由于Electron使用自定义的Node.js版本,需重新编译原生模块:// package.json "scripts": { "rebuild": "electron-rebuild -f -w uiohook-napi" }
执行命令:
npm run rebuild
二、主进程集成示例
以下是在Electron主进程中使用uiohook-napi
的完整示例:
// main.js (Electron主进程文件)
const { app, BrowserWindow, ipcMain } = require('electron');
const { uIOhook, UiohookKey } = require('uiohook-napi');
// 确保原生模块已正确加载
try {
// 初始化钩子实例
const hook = uIOhook;
// 事件监听示例:监听鼠标双击
hook.on('click', (e) => {
if (e.clicks === 2) {
console.log('主进程检测到鼠标双击');
// 向渲染进程发送消息
mainWindow.webContents.send('mouse-double-click', {
x: e.x,
y: e.y
});
}
});
// 事件监听示例:监听键盘按键
hook.on('keydown', (e) => {
if (e.keycode === UiohookKey.F1) {
console.log('主进程检测到F1按键');
}
});
// 应用准备就绪后启动钩子
let mainWindow;
app.whenReady().then(() => {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
mainWindow.loadFile('index.html');
// 启动输入钩子
try {
hook.start();
console.log('输入钩子已启动');
} catch (error) {
console.error('启动钩子失败:', error);
// 处理权限问题(如macOS需要系统权限)
}
});
// 应用关闭时停止钩子并释放资源
app.on('will-quit', () => {
hook.stop();
console.log('输入钩子已停止');
});
// 监听渲染进程消息(示例)
ipcMain.on('request-hook-status', (event) => {
event.returnValue = hook.isRunning();
});
} catch (error) {
console.error('uiohook-napi加载失败:', error);
// 可能需要重新执行electron-rebuild
}
三、关键步骤解析
模块加载与初始化
- 在主进程中直接引入
uiohook-napi
,利用其提供的uIOhook
实例管理输入钩子。 - 需在
app.whenReady()
之后启动钩子,确保Electron环境已准备完毕。
- 在主进程中直接引入
事件监听与进程通信
- 通过
hook.on(event, listener)
监听输入事件(如click
、keydown
)。 - 使用
ipcMain
和webContents.send
实现主进程与渲染进程的消息传递,例如将鼠标双击事件的坐标发送给界面。
- 通过
资源释放
- 在
app.on('will-quit')
中调用hook.stop()
停止钩子,避免程序退出后钩子仍在运行。
- 在
四、跨平台注意事项
权限问题
- macOS:需在系统偏好设置中授予“辅助功能”权限,否则钩子可能无法捕获事件。
- Windows/Linux:通常无需额外权限,但需确保原生模块正确编译。
原生模块编译
若遇到
找不到模块
或编译失败
错误,需确认electron-rebuild
已正确执行,或尝试手动指定Electron版本:electron-rebuild -f -w uiohook-napi --electron-version=25.0.0
钩子冲突
- 避免在多个进程中同时启动钩子,可能导致系统输入监听异常。
五、渲染进程通信示例
若需在界面中响应输入事件,可在渲染进程中接收主进程消息:
// 渲染进程(index.html对应的JS文件)
const { ipcRenderer } = require('electron');
ipcRenderer.on('mouse-double-click', (event, data) => {
console.log('渲染进程接收到双击事件,坐标:', data.x, data.y);
// 更新界面或执行其他操作
});
// 向主进程查询钩子状态
const isHookRunning = ipcRenderer.sendSync('request-hook-status');
console.log('钩子运行状态:', isHookRunning);