枚举进程
要用到下面几个函数
1。
HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
得到一个processes and the heaps, modules, and threads 的快照,参数0表示从当前进程取得。
2。
PROCESSENTRY32 procinfo;
procinfo.dwSize = sizeof(PROCESSENTRY32);
Process32First(handle, &procinfo)
得到第一个进程的信息,放在procinfo中,procinfo.th32ProcessID为进程ID, procinfo.szExeFile为进程名等。
3。
Process32Next(handle, &procinfo)
继续枚举其它进程
下面是一段代码:
//枚举进程
void CMyupdateDlg::OnProcesses()
{
HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(handle==(HANDLE)-1) {
AfxMessageBox("CreateToolhelp32Snapshot error");
return;
}
PROCESSENTRY32 procinfo;
procinfo.dwSize = sizeof(PROCESSENTRY32);
if(::Process32First(handle, &procinfo))
{
do
{
CString str = procinfo.szExeFile;
if(MessageBox(str, "", MB_OKCANCEL) == IDCANCEL)
{
::CloseHandle(handle);
return;
}
}
while(::Process32Next(handle, &procinfo));
::CloseHandle(handle);
}
}
如何杀死一个进程
HANDLE h = ::OpenProcess(PROCESS_ALL_ACCESS, false, procinfo.th32ProcessID);
if(!h) AfxMessageBox("get handle failed.");
TerminateProcess(h, 0);
先用OpenProcess根据进程号得到一个进程的句柄,然后用TerminateProcess杀死进程
枚举窗口
EnumWindows可以用来枚举顶层窗口。每一个参数为一个回调函数。下面是一个例子:
//枚举窗口
void CMyupdateDlg::OnWindow()
{
EnumWindows(EnumWindowsProc, 0);
}
//枚举窗口函数
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
TCHAR str[100];
//if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE) //&WS_POPUP//QQ
::GetWindowText(hWnd, str, 100);
//::GetClassName(hWnd, str, 100);
CString str2;
str2.Format("%s", str);
if(str2.Find("app")>=0)
{
AfxMessageBox(str2);
//::SendMessage(hWnd, WM_CLOSE, 0 , 0);
DWORD dwProcessID;
::GetWindowThreadProcessId(hWnd, &dwProcessID);
HANDLE h = ::OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessID);
::TerminateProcess(h, 0);
}
return TRUE;
}
其中,GetWindowLong用来取得指定窗口的一些信息,如是否可见等
GetWindowThreadProcessId从一个窗口句柄,得到当前窗口句柄所在进程的ID
总结:
1。通过枚举进程可以得到进程的ID,再通过这个ID,可以对进程操作,如关闭等。
2。通过EnumWindows枚举窗口句柄,得到的并不是进程的句柄,而是顶层窗口的。要关闭这个窗口,可以发送WM_CLOSE消息,但不能通过
TerminateProcess,直接利用这个句柄关闭。但可以通过GetWindowThreadProcessId得到窗口所在进程的句柄,再利用TerminateProcess关闭之。
3。这里面有进程、线程、纤程的根据在里面。还没有理清楚。