VC获取某个进程主窗口以及创建进程程序名

VC获取某个进程主窗口以及创建进程程序名

ID:38135902

大小:128.53 KB

页数:5页

时间:2019-06-01

VC获取某个进程主窗口以及创建进程程序名_第1页
VC获取某个进程主窗口以及创建进程程序名_第2页
VC获取某个进程主窗口以及创建进程程序名_第3页
VC获取某个进程主窗口以及创建进程程序名_第4页
VC获取某个进程主窗口以及创建进程程序名_第5页
资源描述:

《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_current

7、ator:publicCWindowIterator{protected:DWORDm_pid;//进程IDvirtualBOOLOnWindow(HWNDhwnd);public:CMainWindowIterator(DWORDpid,DWORDnAlloc=1024);~CMainWindowIterator();};2/5一般来讲,如果隶属于某个进程的窗口没有可见的父窗口,那么这个窗口就可以认为是此进程的主窗口。对WS_VISIBLE的检查很重要,因为有些应用创建多个不可见的顶层窗口。关于CMainWindowIterator类的使用细节请参

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。