当前位置: 首页 > article >正文

枚举进程,枚举窗口

枚举进程

要用到下面几个函数

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

  

http://www.lryc.cn/news/2414185.html

相关文章:

  • C#中遍历所有的性能计数器PerformanceCounter
  • 中国大陆网站TOP100
  • 云的基本概念(公有云、私有云、 IaaS、PaaS、SaaS)
  • Dubbo 入门理论学习
  • Google的人体浏览器
  • Matlab的regionprops详解 连通区域
  • UCloud成首个通过乌云认证的云计算平台
  • linux修改index属性,selectedIndex 属性
  • 转贴:网友line写的火鸟字幕合并器教程
  • for的几种用法
  • MATLAB plotyy总结
  • 纳什均衡和帕累托最优
  • 计算机编程术语总结
  • 深入浅出WPF(一)
  • Cocoa 框架
  • windows C++多线程(三):线程终止结束ExitThread与TerminateThread
  • 关于delphi软件运行出现Invalid floating point operation的错误的解决办法
  • 运维自动化概述
  • Unity3D AVProVideo开始播放跟播放完成
  • 一个坑
  • 驻极体麦克风简介
  • window.history.go(-1)和window.location.go(-1)区别
  • 【毕业设计源码】PHP网上商城管理系统
  • VC6.0下载和安装教程
  • 半导体制冷片-热电效应简介
  • 【Oracle】常用Oracle基础知识
  • 创建DPlink
  • 解决rhythmbox听歌问题
  • input中常用的type属性与使用场景
  • xnio java_使用Cargo Java API和Jenkins部署到Wildfly时出现“XNIO001001:没有找到XNIO提供程序”错误...