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

2021/10/13 11:44:24

本文主要是介绍Electron——如何检测应用程序的为响应状态,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

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

  • 文档地址
    EnumWindows
    IsHungAppWindow
    GetWindowThreadProcessId
    NodeJs——如何获取Windows电脑指定应用进程信息

内容

获取指定应用程序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 pid = Buffer.alloc(255)
   let threadId = User32.GetWindowThreadProcessId(hwnd, pid)
   if (pids.includes(pid) && User32.IsHungAppWindow(hwnd)) {
       // TODO 检测到程序窗口未响应处理方法
   }
  return true
})

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


这篇关于Electron——如何检测应用程序的为响应状态的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程