Electron——如何检测应用程序的未响应状态

前言

我们如何通过Electron来检测一些应用程序的状态呢,如:未响应;

内容

获取指定应用程序PID

通过exec执行cmd命令查询指定应用的PID,并通过electron-store存储获取到的PID,可参考NodeJs——如何获取Windows电脑指定应用进程信息;

/**
 * 获取指定应用程序的PID | 只考虑win和linux
 * @param exeName
 */
export function cmdFindPidList (exeName, callbackFun) {
  const cmd = process.platform === 'win32' ? `tasklist -V|findstr "${exeName}" ` : `ps aux | grep ${exeName}`;
  let pids = [];
  exec(cmd, (err, stdout, stderr) => {
    if (err) {
      callbackFun(pids);
      return
    }
    stdout.split('\n').filter(item => {
      const p = item.trim().split(/\s+/)
      // p[0] 应用程序名称  p[1] 应用程序PID
      if (p[0] && p[1]) {
        pids.push(p[1]);
      }
    })
    callbackFun(pids);
  })
}

// 调用
 cmdFindPidList('App.exe', (pids) => {
      // 封装的`electron-store`存储
      setStore('AppPids', pids)
  })

调用user32.dll方法

const User32 = ffi.Library('user32.dll', {
  EnumWindows: ['bool', ['pointer', 'long']],
  GetWindowThreadProcessId: ['int', ['long', 'pointer']],
  IsHungAppWindow: ['bool', ['long']]
})

const EnumWindowsProc = ffi.Callback('bool', ['long', 'int32'], function (hwnd, lParam) {
   let pids = getStore('AppPids')
   let pidBuff = Buffer.alloc(255)
   let threadId = User32.GetWindowThreadProcessId(hwnd, pidBuff)
   let pid = String(pidBuff.readInt32LE(0))
   if (pids.includes(pid) && User32.IsHungAppWindow(hwnd)) {
       // TODO 检测到程序窗口未响应处理方法
   }
  return true
})

// 调用
User32.EnumWindows(EnumWindowsProc, 0)
学无止境,谦卑而行.
posted @ 2021-10-13 11:30  。思索  阅读(7)  评论(0编辑  收藏  举报