在没有cmd.exe弹出窗口的情况下使用popen在Windows上执行任务列表

时间:2011-01-25 16:48:13

标签: c popen tasklist

大家好,谢谢

我正在用C语言开发某种监控应用程序,我需要获取当前的任务列表。因此,我正在使用tasklist并获得输出,这要归功于popen();

ptr = popen("tasklist /V", "r");
while(1)
{
    if(fgets(temp, 255, ptr) == NULL) break;
    fputs(temp, log);
}

问题是,在几分之一秒内会弹出一个cmd.exe窗口并且这真的很令人不安,因为它会将焦点切换到新窗口,这会使我的应用程序进入窗口模式而不是全屏模式。

所以,我花了几天时间查看popen方式或Windows本身,以'隐藏'模式/窗口启动该过程,但没有结果。 我已经尝试过的事情包括:

cmd.exe /c tasklist /V
start /b cmd.exe /c tasklist /V
start /min /b cmd.exe /c tasklist /V
start /min cmd.exe /c tasklist /V
tasklist > somefile

我也尝试了最后一个,所以我会读取 somefile 的输出,但似乎tasklist强制输出到stdout,因为在创建文件时没有写入数据。

希望你的回答,无论如何都要感谢你。

2 个答案:

答案 0 :(得分:3)

您可以致电CreateProcessSW_HIDE作为STARTUPINFO结构的wShowWindow字段,并在CREATE_NO_WINDOW中加入dwCreationFlags来实现此目的。

此方法有点脆弱,因为您可能会发现您的应用在版本为tasklist且具有不同输出格式的计算机上运行。

如果您想要一个正在运行的所有进程的列表,可以调用EnumProcesses

答案 1 :(得分:1)

使用EnumProcesses可以轻松实现任务。

给定here的直观示例。