微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

前言

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

内容

获取指定应用程序PID

通过@H_404_17@exec执行cmd命令查询指定应用的PID,并通过@H_404_17@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 pid = Buffer.alloc(255)
   let threadId = User32.GetwindowThreadProcessId(hwnd, pid)
   if (pids.includes(pid) && User32.IsHungAppWindow(hwnd)) {
       // Todo 检测到程序窗口未响应处理方法
   }
  return true
})

// 调用
User32.EnumWindows(EnumWindowsProc, 0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐