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

简介: 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)

tasklist(推荐)

通过webworker新起一个线程进行检测

import { exec } from 'child_process'
onmessage = function (e) {
  console.info(`worker: ${e.data}`)
  setInterval(() => {
    try {
      exec("tasklist /V /FI \"STATUS ne RUNNING\" | findstr \"xxxx.exe\"", (err, stdout, stderr) => {
        if (!err) {
          stdout.split('\n').filter(item => {
            const p = item.trim().split(/\s+/)
            // p[0] 应用程序名称  p[1] 应用程序PID 断开连接的时候p[2]会话名会没有一定要注意
            if (p[0] ==='xxxx.exe' && p[1]) {
              try {
                exec(`taskkill /F /PID ${p[1]} /T`, (error, stdout, stderr) => {
                  if (!error) console.info(`worker: 清除无响应xxxx.exe成功 ===> p[0](应用名称) => ${p[0]}, p[1](应用程序PID) => ${p[1]}`)
                })
              } catch (e) {
                console.error(`worker: 清除无响应xxxx.exe失败 ===> ${e}`)
              }
            }
          })
        }
      })
    } catch (e) {
      console.error(`worker:关闭无响应xxxx.exe,${e}`)
    }
  }, 10000)
}

BAT脚本

@echo off
:start
:: 检测状态为未相应的应用进程 | 所有不理解的命令均可通过帮助进行查看,示例如下
:: for /?
for /f "skip=3 tokens=2 " %%i in ('tasklist /V /FI "STATUS ne RUNNING" /FI "imageNAME eq xxx.exe"') do (
 ::日志输出文件主要看bat启动位置
 echo "%Date% %time% 记录无响应的应用进程PID: %%i" >> "exeStatus.txt"
 for /f "tokens=3* delims=: " %%j in ('find /C "%%i" exeStatus.txt') do (
       ::大于3次
       if %%j GTR 3 (
    echo "%Date% %time% 开始清除出现%%j次无响应的应用进程PID: %%i">> "DelExePid.txt"
    taskkill /F /PID %%i /T >> "DelExePid.txt"
    findstr /V %%i "exeStatus.txt" > "exeStatus.tmp"
    move /Y exeStatus.tmp exeStatus.txt
  )
 )
)
::10s检测一次
choice /t 10 /d y /n > null
goto start

学无止境,谦卑而行.

目录
相关文章
|
前端开发 JavaScript Windows
Electron - 创建跨平台的桌面客户的应用程序
  Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序。它是基于io.js 和 Chromium 开源项目,并用于在 Atom 编辑器中。
1262 0
|
1月前
|
人工智能 移动开发 JavaScript
如何用uniapp打包桌面客户端exe包,vue或者uni项目如何打包桌面客户端之electron开发-优雅草央千澈以开源蜻蜓AI工具为例子演示完整教程-开源代码附上
如何用uniapp打包桌面客户端exe包,vue或者uni项目如何打包桌面客户端之electron开发-优雅草央千澈以开源蜻蜓AI工具为例子演示完整教程-开源代码附上
215 18
|
3月前
|
JSON JavaScript 前端开发
开发桌面程序-Electron入门
【10月更文挑战第16天】Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用的框架,嵌入了 Chromium 和 Node.js。本文介绍了如何搭建 Electron 开发环境,包括安装 Node.js、创建项目、配置 main.js 和打包应用。通过简单的步骤,你可以快速创建并运行一个基本的 Electron 应用程序。
134 4
开发桌面程序-Electron入门
|
6月前
|
JavaScript 开发工具
Electron 开发过程中主进程的无法看到 console.log 输出怎么办
Electron 开发过程中主进程的无法看到 console.log 输出怎么办
|
7月前
|
前端开发
PC端01,桌面端,electron的开发,electron的开发的系列课程,软件开发必备流程,electron的讲解,electron的开发,vitepress博主的gitee链接,PC端效率软件
PC端01,桌面端,electron的开发,electron的开发的系列课程,软件开发必备流程,electron的讲解,electron的开发,vitepress博主的gitee链接,PC端效率软件
PC端01,桌面端,electron的开发,electron的开发的系列课程,软件开发必备流程,electron的讲解,electron的开发,vitepress博主的gitee链接,PC端效率软件
|
9月前
|
移动开发 开发框架 JavaScript
Vue3 Vite electron 开发桌面程序
Vue3 Vite electron 开发桌面程序
390 0
|
前端开发 算法 JavaScript
从零开始开发图床工具:使用 Gitee 和 Electron 实现上传、管理和分享(下)
从零开始开发图床工具:使用 Gitee 和 Electron 实现上传、管理和分享(下)
253 0
|
存储 Web App开发 JavaScript
从零开始开发图床工具:使用 Gitee 和 Electron 实现上传、管理和分享(上)
从零开始开发图床工具:使用 Gitee 和 Electron 实现上传、管理和分享(上)
275 0
|
Web App开发 资源调度 前端开发
基于NeteaseCloudMusicApi和electron-vue开发网易云音乐--electron-vue初始化
基于NeteaseCloudMusicApi和electron-vue开发网易云音乐--electron-vue初始化
170 0
|
前端开发 JavaScript API
React使用Electron开发桌面端
React是一个流行的JavaScript库,用于构建Web应用程序。结合Electron框架,可以轻松地将React应用程序打包为桌面应用程序。以下是使用React和Electron开发桌面应用程序的步骤:
React使用Electron开发桌面端