electron 监听鼠标双击事件

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

以下是完整的集成步骤和注意事项:

一、环境准备与安装

  1. 安装依赖
    在Electron项目中,需将uiohook-napi安装为主进程依赖,并确保安装electron-rebuild处理原生模块编译:

    npm install uiohook-napi --save
    npm install electron-rebuild --save-dev
  2. 配置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
}

三、关键步骤解析

  1. 模块加载与初始化

    • 在主进程中直接引入uiohook-napi,利用其提供的uIOhook实例管理输入钩子。
    • 需在app.whenReady()之后启动钩子,确保Electron环境已准备完毕。
  2. 事件监听与进程通信

    • 通过hook.on(event, listener)监听输入事件(如clickkeydown)。
    • 使用ipcMainwebContents.send实现主进程与渲染进程的消息传递,例如将鼠标双击事件的坐标发送给界面。
  3. 资源释放

    • app.on('will-quit')中调用hook.stop()停止钩子,避免程序退出后钩子仍在运行。

四、跨平台注意事项

  1. 权限问题

    • macOS:需在系统偏好设置中授予“辅助功能”权限,否则钩子可能无法捕获事件。
    • Windows/Linux:通常无需额外权限,但需确保原生模块正确编译。
  2. 原生模块编译

    • 若遇到找不到模块编译失败错误,需确认electron-rebuild已正确执行,或尝试手动指定Electron版本:

      electron-rebuild -f -w uiohook-napi --electron-version=25.0.0
  3. 钩子冲突

    • 避免在多个进程中同时启动钩子,可能导致系统输入监听异常。

五、渲染进程通信示例

若需在界面中响应输入事件,可在渲染进程中接收主进程消息:

// 渲染进程(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);

你可能感兴趣的:(electron)