Electron主进程捕获鼠标移动事件的方法咨询
在Electron主进程中捕获全局鼠标移动事件的优雅方案
嘿,我完全懂你想要的——在Electron主进程里优雅捕获全局鼠标移动(哪怕鼠标在窗口外),之前用setInterval轮询确实既不高效也不够优雅。其实有两种靠谱的方案可以解决这个问题,咱们一步步来看:
方案一:用事件驱动的第三方库(推荐,彻底告别轮询)
Electron主进程本身没有原生提供全局鼠标移动的事件监听,但有成熟的第三方库可以帮我们直接监听系统级的鼠标事件,完全不用轮询。比如global-mouse-events这个库,它支持Windows、macOS和Linux三大平台,能完美捕获窗口内外的鼠标移动。
步骤:
- 先安装依赖:
npm install global-mouse-events
- 在主进程中引入并使用:
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
相关产品推荐
相关产品推荐

