枚举进程

枚举进程

要用到下面几个函数

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。这里面有进程、线程、纤程的根据在里面。还没有理清楚。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值