VC中来获得显示当前运行的所有进程的方法有很多,下面介绍两种方法。

1、通过CreateToolhelp32Snapshot来创建所有进程的快照,然后获取所有进程的信息。

代码实现如下,可在VC6.0下运行。

#include <windows.h>
#include
<tlhelp32.h>
#include
<stdio.h>
#include
<iostream.h>
#include
<Winbase.h>

BOOL PrintProcessList( )
{
/*得到所有进程的快照*/
HANDLE hProcessSnap
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(INVALID_HANDLE_VALUE == hProcessSnap)
{
cout
<<"创建进程快照失败!"<<endl;
return FALSE;
}

/*保存进程信息的结构体*/
PROCESSENTRY32 ProEntry32;
memset(
&ProEntry32, 0, sizeof(ProEntry32));
ProEntry32.dwSize
= sizeof(ProEntry32);

/*得到第一个进程的信息*/
if(!Process32First(hProcessSnap, &ProEntry32))
{
cout
<<"获取进程信息失败!"<<endl;
CloseHandle(hProcessSnap);
return FALSE;
}

/*显示所有的进程的相关信息*/
do
{
/*显示进程名称*/
cout
<<ProEntry32.szExeFile<<endl;

}
while(Process32Next(hProcessSnap, &ProEntry32));

CloseHandle( hProcessSnap );
return TRUE;
}

void main( )
{
PrintProcessList();
}

2、通过EnumProcesses来获得所有进程的ID,然后根据ID获取进程的信息。

代码实现如下,由于VC6.0中没有EnumProcesses函数,因此只能在VS2003以上版本中运行。

#include "stdafx.h"
#include
<windows.h>
#include
<stdio.h>
#include
<tchar.h>
#include
"psapi.h"

BOOL PrintEnumProcess()
{
DWORD arrProIds[
1024], ByteCnt, ProCnt;

/*获得所有的进程的ID*/
if (!EnumProcesses(arrProIds, sizeof(arrProIds), &ByteCnt))
{
_tprintf( TEXT(
"获取所有进程的ID失败!\n"));
return FALSE;
}

/*计算获得的进程ID的数量*/
ProCnt
= ByteCnt / sizeof(DWORD);

/*输出所有进程的名称*/
for (unsigned int i = 0; i < ProCnt; i++)
{
if( arrProIds[i] != 0 )
{
TCHAR szProcessName[MAX_PATH]
= TEXT("<unknown>");

HANDLE hProcess
= OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, arrProIds[i]);

/*得到进程的名称*/
if (NULL != hProcess )
{
HMODULE hMod;
DWORD ByteCnt;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&ByteCnt) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}

_tprintf( TEXT(
"%s\n"), szProcessName);

CloseHandle( hProcess );
}
}

return TRUE;
}

int _tmain(int argc, _TCHAR* argv[])
{
PrintEnumProcess();

system(
"pause");

return 0;
}

posted on 2011-06-09 22:11  闲云鹤  阅读(4652)  评论(0编辑  收藏  举报