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();
}
#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;
}
#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;
}