欢迎来到天天文库
浏览记录
ID:38135902
大小:128.53 KB
页数:5页
时间:2019-06-01
《VC获取某个进程主窗口以及创建进程程序名》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、获取某个进程的主窗口以及创建进程的程序名?整理:罗万在编写工具程序以及系统管理程序的时候。常常需要获取某个进程的主窗口以及创建此进程的程序名。获取主窗口的目的是向窗口发送各种消息。获取启动进程的程序名可以控制对进程的操作。但是有些进程往往有多个主窗口。你要的是哪一个主窗口呢?如果你用过Outlook程序,你就会发现它有多个主窗口,一个窗口列出收件箱和其它文件夹。如果你打开e-mail,便会有另外一个窗口显示信息。它们都是没有父窗口(或者说宿主窗口)的主窗口。运行一下Spy程序,你甚至会发现它们的窗口类名都相同:rctrl_renwnd32。资源管理器(Explorer
2、.exe)也有不止一个主窗口。如图一所示,资源管理器有两个主窗口。一般来讲,想要获取主窗口,凭窗口的式样或类名,你没有什么办法知道哪一个窗口是真正意义上的主窗口。首先我们讨论如何从多个窗口中获取主窗口?其实很容易。利用两个API函数便可以实现。这两个API是EnumWindows和GetWindowThreadProcessId。如果你对这两个函数不熟悉,不要怕,本文提供了一个C++类来对这两个API进行封装。这个类叫CMainWindowIterator,用它可以枚举某个进程(已知进程ID)的所有主窗口。这正是我们想要的东西。其使用方法如下:DWORDpid=//已
3、知某个进程的IDCMainWindowIteratoritw(pid);for(HWNDhwnd=itw.First();hwnd;hwnd=itw.Next()){//dosomething}就这么简单,CMainWindowIterator派生于一个更通用的类:CWindowIterator,CWindowIterator负责将::EnumWindows函数打包以隐藏回调细节。它有一个虚拟函数OnWindow,你可以在派生类中重写这个函数,从而可以用任何方式来枚举窗口。CMainWindowIterator就是重写了OnWindow函数,让它只获取属于某个给定进程
4、的主窗口://(在构造函数中设置m_pid)BOOLCMainWindowIterator::OnWindow(HWNDhwnd){if((GetWindowLong(hwnd,GWL_STYLE)&WS_VISIBLE)){DWORDpidwin;GetWindowThreadProcessId(hwnd,&pidwin);if(pidwin==m_pid)returnTRUE;}returnFALSE;}1/5这两个类的定义如下:(对应的文件是EnumProc.h和EnumProc.cpp)/////////////////////////////////////
5、///////////////////这个类主要是封装::EnumWindows,列举顶层窗口//classCWindowIterator{protected:HWND*m_hwnds;//隶属于某个进程PID窗口句柄数组DWORDm_nAlloc;//数组大小DWORDm_count;//找到的窗口句柄数DWORDm_current;//当前的窗口句柄staticBOOLCALLBACKEnumProc(HWNDhwnd,LPARAMlp);//虚拟枚举函数virtualBOOLOnEnumProc(HWNDhwnd);//在派生中改写此函数来过滤不同种类的窗口vi
6、rtualBOOLOnWindow(HWNDhwnd){returnTRUE;}public:CWindowIterator(DWORDnAlloc=1024);~CWindowIterator();DWORDGetCount(){returnm_count;}HWNDFirst();HWNDNext(){returnm_hwnds&&m_current7、ator:publicCWindowIterator{protected:DWORDm_pid;//进程IDvirtualBOOLOnWindow(HWNDhwnd);public:CMainWindowIterator(DWORDpid,DWORDnAlloc=1024);~CMainWindowIterator();};2/5一般来讲,如果隶属于某个进程的窗口没有可见的父窗口,那么这个窗口就可以认为是此进程的主窗口。对WS_VISIBLE的检查很重要,因为有些应用创建多个不可见的顶层窗口。关于CMainWindowIterator类的使用细节请参
7、ator:publicCWindowIterator{protected:DWORDm_pid;//进程IDvirtualBOOLOnWindow(HWNDhwnd);public:CMainWindowIterator(DWORDpid,DWORDnAlloc=1024);~CMainWindowIterator();};2/5一般来讲,如果隶属于某个进程的窗口没有可见的父窗口,那么这个窗口就可以认为是此进程的主窗口。对WS_VISIBLE的检查很重要,因为有些应用创建多个不可见的顶层窗口。关于CMainWindowIterator类的使用细节请参
此文档下载收益归作者所有