前言
我们如何通过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 pid = Buffer.alloc(255)
let threadId = User32.GetWindowThreadProcessId(hwnd, pid)
if (pids.includes(pid) && User32.IsHungAppWindow(hwnd)) {
// TODO 检测到程序窗口未响应处理方法
}
return true
})
// 调用
User32.EnumWindows(EnumWindowsProc, 0)