前言
最近在开发 electron 应用遇到这样一个需求,定时统计当前系统各个软件的时长,第一步是监听当前用户激活的软件窗口这个可以通过一些依赖库 active-win 解决。
关键是!!用户如果长时间没有操作那么这个时间就要停止计算,那么我就考虑到使用一些鼠标键盘的事件来监听
调研
第一个找到的是 iohook,这个依赖好像已经停止维护了,自己也搞了半天兼容性,弄来弄去没弄好,就放弃了/
第二个是在 iohook 的 issues 里面看到的 uiohook-napi,这个一开始运行都是很正常,但是在长时间运行后,如果退出软件就会出现长时间无响应,可以看 issues
electron 内置
在找了很久之后一直没有找到,突然灵机一闪,大家都知道浏览器有一个 requestIdleCallback 方法,可以判断一帧有空闲时间,我就开始往这方面出发,如果我能拿到用户在一段时间内电脑的空余时间和这一段时间是否相等,就能知道用户在这段时间有没有操作电脑。
就开始看起了 electron 官方文档,最后找到了 powerMonitor.getSystemIdleTime()
使用
powerMonitor.getSystemIdleTime()
Returns Integer - 几秒钟内的空闲时间
具体代码
this.detectTimer = setInterval(async () => {
// 系统空闲时间
const idleTime = powerMonitor.getSystemIdleTime()
// 有操作
if (idleTime < 5) {
this.changeActionState()
console.log(`5s 内有操作==`, idleTime)
} else {
// 无操作
console.log(`5s 内无操作xx`, idleTime)
}
}, 5000)
最后
在解决这个问题的时候,一开始陷入了死胡同,总是定向的想到通过监控一些用户操作来实现这个功能,有时候更多的还是跳出惯性思维,发散性的思考。