使用QProcess获取所有正在运行的进程信息

时间:2010-04-13 19:31:55

标签: windows qt qprocess

前几天我问到如何使用QProcess获取系统中所有正在运行的进程。 我找到了一个可以将所有进程输出到文件的命令行:

C:\ WINDOWS \ system32 \ wbem \ wmic.exe“/OUTPUT:C:\ProcessList.txt PROCESS get Caption

这将创建C:\ ProcessList.txt文件,其中包含系统中所有正在运行的进程。 我想知道如何使用QProcess运行它并将其输出变为变量。

似乎每次我试图运行它并且没有发生任何事情:

QString program = "C:\\WINDOWS\\system32\\wbem\\wmic.exe";
QStringList arguments;
arguments << "/OUTPUT:C:\\ProcessList.txt" <<"PROCESS"<< "get"<< "Caption";

process->setStandardOutputFile("process.txt");
process->start(program,arguments);

QByteArray result = process->readAll();

我不想创建process.txt并将所有输出都带到变量......

2 个答案:

答案 0 :(得分:7)

您可以使用“/ OUTPUT:STDOUT”开关运行wmic.exe,直接将进程信息打印到stdout。但是,我无法通过QProcess API读取此信息并将其保存在变量中。这是我使用的代码:

#include <QtCore/QCoreApplication>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess process;
    process.setReadChannel(QProcess::StandardOutput);
    process.setReadChannelMode(QProcess::MergedChannels);
//    process.start("cmd.exe /C echo test");
    process.start("wmic.exe /OUTPUT:STDOUT PROCESS get Caption");

    process.waitForStarted(1000);
    process.waitForFinished(1000);

    QByteArray list = process.readAll();
    qDebug() << "Read" << list.length() << "bytes";
    qDebug() << list;
}

此代码成功捕获“cmd.exe / C echo test”的输出,但不适用于wmic.exe。似乎进程wmic.exe永远不会完成,我想它的stdout永远不会被刷新,因此你不会通过QProcess :: readAll()收到任何东西。

这是我能给你的全部帮助。也许您或其他一些SO用户会在上面的代码段中找到错误。

答案 1 :(得分:2)

试试这个会很好用。

process.start("cmd", QStringList() << "/C" << "echo" << "process" << "get" << "caption" << "|" << "wmic");