zoukankan      html  css  js  c++  java
  • 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('
    ').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)
    
    学无止境,谦卑而行.
  • 相关阅读:
    实现分布式爬虫
    hadoop安装文档
    远程连接mysql和redis配置
    scrapy(2)
    10月10号动手动脑
    10月6日和动手动脑
    10月4日
    课程总结
    又学java的第一天
    第一节测试总结
  • 原文地址:https://www.cnblogs.com/wangyang0210/p/15401370.html
Copyright © 2011-2022 走看看