Electron 项目中获取 Windows 进程列表的深入剖析
一、引言
在 Windows 系统下的 Electron 项目开发中,获取进程列表信息是一项十分关键的任务。这对于进程管理、资源监控、应用程序交互等多种功能的实现都有着重要意义。我们将围绕给出的代码片段,深入探讨如何完善代码以准确、高效地获取进程列表,包括进程 ID 等关键信息。
二、Windows 下获取进程列表的基础知识
(一)tasklist 命令概述
在 Windows 操作系统中,tasklist
是一个强大的命令行工具。它可以列出当前系统中正在运行的进程的详细信息。通过不同的参数组合,可以实现对进程的筛选和查询。例如,/fi
参数用于指定筛选条件。
(二)现有代码分析
我们有两个代码片段:const tasklistCommand =
tasklist /fi “imagename eq ${processname}”;
和const tasklistCommand =
tasklist /fi “windowtitle eq ${processWindowTitle}”;
。这里分别是通过进程的图像名称(imagename
)和窗口标题(windowtitle
)来筛选进程。然而,这只是获取进程列表的起点,还有很多工作要做。
三、完善代码以获取进程列表
(一)执行命令获取原始输出
首先,我们需要在 Electron 项目中执行这些tasklist
命令。在 Node.js(Electron 基于 Node.js)环境中,可以使用child_process
模块来实现。以下是一个基本的示例代码:
const { exec } = require('child_process');
function getProcessListByImageName(processname) {
const tasklistCommand = `tasklist /fi "imagename eq ${processname}"`;
return new Promise((resolve, reject) => {
exec(tasklistCommand, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(stdout);
}
});
});
}
function getProcessListByWindowTitle(processWindowTitle) {
const tasklistCommand = `tasklist /fi "windowtitle eq ${processWindowTitle}"`;
return new Promise((resolve, reject) => {
exec(tasklistCommand, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(stdout);
}
});
});
}
在上述代码中,我们创建了两个函数getProcessListByImageName
和getProcessListByWindowTitle
,它们分别根据进程图像名称和窗口标题获取进程列表信息。通过exec
函数执行tasklist
命令,并将结果以 Promise 的形式返回。
(二)解析原始输出
tasklist
命令的输出是一个文本格式,我们需要解析它来提取有用的信息,如进程 ID、内存使用等。以下是一个简单的解析函数示例:
function parseProcessList(output) {
const lines = output.split('\n');
const processList = [];
for (let i = 3; i < lines.length - 1; i++) { // 跳过标题行和空行
const parts = lines[i].trim().split(/\s+/);
const processInfo = {
pid: parseInt(parts[1]),
imageName: parts[0],
sessionName: parts[2],
sessionNumber: parseInt(parts[3]),
memoryUsage: parts[4],
status: parts[5]
};
processList.push(processInfo);
}
return processList;
}
这个函数接受tasklist
命令的输出文本,将其按行分割,然后提取每一行中的关键信息,构建一个包含进程详细信息的对象数组。
(三)完整的获取和解析进程列表函数
结合前面的代码,我们可以创建更完整的函数:
const { exec } = require('child_process');
function getAndParseProcessListByImageName(processname) {
const tasklistCommand = `tasklist /fi "imagename eq ${processname}"`;
return new Promise((resolve, reject) => {
exec(tasklistCommand, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
const parsedList = parseProcessList(stdout);
resolve(parsedList);
}
});
});
}
function getAndParseProcessListByWindowTitle(processWindowTitle) {
const tasklistCommand = `tasklist /fi "windowtitle eq ${processWindowTitle}"`;
return new Promise((resolve, reject) => {
exec(tasklistCommand, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
const parsedList = parseProcessList(stdout);
resolve(parsedList);
}
});
});
}
四、案例代码展示与应用场景
(一)查找特定应用程序的进程
假设我们要查找所有正在运行的notepad.exe
进程。可以使用以下代码:
getAndParseProcessListByImageName('notepad.exe').then((processList) => {
console.log('找到的 notepad.exe 进程列表:', processList);
}).catch((error) => {
console.error('获取进程列表出错:', error);
});
(二)根据窗口标题查找进程
如果我们知道某个窗口的标题,比如一个自定义应用程序的特定窗口标题为“我的重要窗口”,可以这样查找相关进程:
getAndParseProcessListByWindowTitle('我的重要窗口').then((processList) => {
console.log('根据窗口标题找到的进程列表:', processList);
}).catch((error) => {
console.error('获取进程列表出错:', error);
});
这些案例展示了如何在 Electron 项目中利用完善后的代码来获取和解析进程列表信息,可用于诸如进程监控、自动化操作等多种应用场景。
五、总结
在本文中,我们从最初的简单tasklist
命令代码片段出发,逐步完善了在 Electron 项目中获取和解析 Windows 进程列表信息的代码。通过理解tasklist
命令的原理、执行命令获取输出、解析输出内容,我们实现了功能强大的进程列表获取函数,并通过案例展示了其在实际开发中的应用。这为 Electron 开发者在进程管理相关功能的实现上提供了有力的支持,有助于开发出更稳定、高效的桌面应用程序。