我们如何通过Electron来检测一些应用程序的状态呢,如:未响应;
通过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) })
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)