16,472
社区成员
发帖
与我相关
我的任务
分享
//既有显示进程的功能,也有查找某一进程是否存在的功能
BOOL CChatSvrDlg::GetProcessListInfor(CString &strFindProcess,BOOL &bFindPro)//默认没找到
{
//初始化
int n_NumProcesses=0;
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32={0}; //定义一个PROCESSENTRY32结构(注意:#include "tlhelp32.h" toolhelp API头文件)
//获得句柄
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//建立进程快照
if(hProcessSnap==(HANDLE)-1)
{
CString strError;
strError.Format("\nCreateToolhelp32Snapshot()failed:%d",GetLastError());
SendMsgToControler(strError);
return FALSE;
}
pe32.dwSize=sizeof(PROCESSENTRY32);//初始化
if (strFindProcess=="")//查找进程名为空,说明执行显示进程操作
{
SendMsgToControler("the infor of processes will be shown respectively...");
}
//查找进程用的
CString strProName;
BOOL bUseFind=FALSE;//标志是否在使用查找功能
//列举所有进程名称
if(Process32First(hProcessSnap,&pe32))//得到第一个进程
{
do
{
//依次获取进程信息
CString strProInfo;
strProInfo.Format("%-25sPID:%d",pe32.szExeFile,pe32.th32ProcessID);//'-'表示左对齐
strProName.Format("%s",pe32.szExeFile);
//实现查找某一进程现在是否存在的功能
if (strFindProcess!="")//如果不为空,则执行查找功能;若为空,则跳过
{
bUseFind=TRUE;//标志在使用查找功能
if (strProName==strFindProcess)//找到
{
bFindPro=TRUE;
return TRUE;//只执行查找功能,不再向下执行显示进程功能
}
else
{
continue;//从头开始,查找下一个
}
}
SendMsgToControler(strProInfo);//一个一个发送进程信息
n_NumProcesses++;//进程计数
}
while(Process32Next(hProcessSnap,&pe32));//直到列举完毕
}
else//错误
{
CString strError;
strError.Format("\nProcess32First()failed:%d",GetLastError());
SendMsgToControler(strError);
return FALSE;
}
//关闭句柄
CloseHandle(hProcessSnap);
if (bUseFind)//执行过查找功能,但没有找到所要进程
{
return TRUE;//只执行查找功能,不再向下执行显示进程功能
}
CString str_NumPro;
str_NumPro.Format("%d",n_NumProcesses);//获得进程的数量
SendMsgToControler("At present,the num of processes is: "+str_NumPro);
return TRUE;
}