提示:關(guān)鍵是利用kernel32.dll中的
CreateToolhelp32Snapshot,Process32First,Process32Next函數(shù)。
并且要熟悉相關(guān)的結(jié)構(gòu)體變量,比如PROCESSENTRY32等。
編程的方法類似與TC(DOS)中的findfirst,findnext。
1、首先查找所需函數(shù)的入口地址。
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、得到所有進(jìn)程印象的句柄。
HANDLE hps=NULL;
hps=(HANDLE)CT32S(TH32CS_SNAPPROCESS,NULL);
3、定義進(jìn)程結(jié)構(gòu)體變量,在使用Process32First和Process32Next中需要它的指針。
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(PROCESSENTRY32);
4、開(kāi)始查找進(jìn)程。
BOOL b;
//查找第一個(gè)進(jìn)程;
b=P32F((DWORD)hps,(DWORD)&pe32);
DWORD count=0;
CString str;
if(b)
{
PutLB(&pe32);//輸出結(jié)果到列表
m_PID[count]=pe32.th32ProcessID;//記住進(jìn)程的ID,以后Kill時(shí)使用;
//這樣不必在轉(zhuǎn)換
count++;
//如果查到循環(huán)進(jìn)行繼續(xù)查找直到查不到下一個(gè)進(jìn)程
while(1)
{
b=P32N((DWORD)hps,(DWORD)&pe32);
m_PID[count]=pe32.th32ProcessID;
if(!b)
break;
PutLB(&pe32);
count++;
}
}
5、顯示進(jìn)程的個(gè)數(shù)。
CString s;
s.Format("Find All Process Ver1.0 Total %d",count);
this->SetWindowText(s);
CloseHandle(hmk);