前言
我们如何通过Electron来检测一些应用程序的状态呢,如:未响应;
内容
获取指定应用程序PID
通过@H_404_17@exec执行cmd命令查询指定应用的PID,并通过@H_404_17@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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。