提示:关键是利用kernel32.dll中的
CreateToolhelp32Snapshot,Process32First,Process32Next函数。
并且要熟悉相关的结构体变量,比如PROCESSENTRY32等。
编程的方法类似与TC(DOS)中的findfirst,findnext。
1、首先查找所需函数的入口地址。
HMODULE hmk;
hmk=GetModuleHandle("kernel32.dll");
typedef DWORD (WINAPI *NEWAPI)(DWORD,DWORD);
NEWAPI CT32S=NULL;//CreateToolhelp32Snapshot
CT32S=(NEWAPI)GetProcAddress(hmk,"CreateToolhelp32Snapshot");
NEWAPI P32F;//Process32First
P32F=(NEWAPI)GetProcAddress(hmk,"Process32First");
NEWAPI P32N;//Process32Next
P32N=(NEWAPI)GetProcAddress(hmk,"Process32Next");
2、得到所有进程印象的句柄。
HANDLE hps=NULL;
hps=(HANDLE)CT32S(TH32CS_SNAPPROCESS,NULL);
3、定义进程结构体变量,在使用Process32First和Process32Next中需要它的指针。
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(PROCESSENTRY32);
4、开始查找进程。
BOOL b;
//查找第一个进程;
b=P32F((DWORD)hps,(DWORD)&pe32);
DWORD count=0;
CString str;
if(b)
{
PutLB(&pe32);//输出结果到列表
m_PID[count]=pe32.th32ProcessID;//记住进程的ID,以后Kill时使用;
//这样不必在转换
count++;
//如果查到循环进行继续查找直到查不到下一个进程
while(1)
{
b=P32N((DWORD)hps,(DWORD)&pe32);
m_PID[count]=pe32.th32ProcessID;
if(!b)
break;
PutLB(&pe32);
count++;
}
}
5、显示进程的个数。
CString s;
s.Format("Find All Process Ver1.0 Total %d",count);
this->SetWindowText(s);
CloseHandle(hmk);