提示:關鍵是利用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);