You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron主进程捕获鼠标移动事件的方法咨询

在Electron主进程中捕获全局鼠标移动事件的优雅方案

嘿,我完全懂你想要的——在Electron主进程里优雅捕获全局鼠标移动(哪怕鼠标在窗口外),之前用setInterval轮询确实既不高效也不够优雅。其实有两种靠谱的方案可以解决这个问题,咱们一步步来看:

方案一:用事件驱动的第三方库(推荐,彻底告别轮询)

Electron主进程本身没有原生提供全局鼠标移动的事件监听,但有成熟的第三方库可以帮我们直接监听系统级的鼠标事件,完全不用轮询。比如global-mouse-events这个库,它支持Windows、macOS和Linux三大平台,能完美捕获窗口内外的鼠标移动。

步骤:

  1. 先安装依赖:
npm install global-mouse-events
  1. 在主进程中引入并使用:
const { app } = require('electron');
const GlobalMouseEvents = require('global-mouse-events');

app.whenReady().then(() => {
  // 创建鼠标监听实例
  const mouseListener = new GlobalMouseEvents();

  // 监听鼠标移动事件
  mouseListener.on('mousemove', (event) => {
    console.log('当前鼠标位置:', event.x, event.y);
    // 这里写你需要处理的逻辑
  });

  // 重要:应用退出时销毁监听,避免内存泄漏
  app.on('before-quit', () => {
    mouseListener.destroy();
  });
});

这个方案完全是事件驱动的,只有当鼠标真的移动时才会触发回调,CPU占用极低,非常优雅。

方案二:优化后的轮询方案(不想用第三方库时可选)

如果不想引入额外依赖,我们可以优化轮询逻辑,让它更高效。主进程中直接调用Electron的screen模块获取鼠标位置,比渲染进程的轮询更直接(不需要跨进程通信),同时设置合理的间隔来降低CPU消耗。

代码示例:

const { app, screen } = require('electron');
let mousePollInterval;

app.whenReady().then(() => {
  // 设置轮询间隔为16ms(约60次/秒,接近屏幕刷新率)
  mousePollInterval = setInterval(() => {
    const mousePos = screen.getCursorScreenPoint();
    console.log('当前鼠标位置:', mousePos.x, mousePos.y);
    // 处理你的业务逻辑
  }, 16);

  // 应用退出时清除定时器
  app.on('before-quit', () => {
    clearInterval(mousePollInterval);
  });
});

注意点:

  • 别再用0ms的间隔了,16ms的间隔既能保证位置更新的流畅性,又不会过度占用CPU。
  • 一定要在应用退出时清除定时器,防止内存泄漏。

内容的提问来源于stack exchange,提问作者user9016567

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:59:53