WEB开发网
开发学院软件开发VC 如何获取其它进程中窗口的窗口过程 阅读

如何获取其它进程中窗口的窗口过程

 2007-03-17 22:00:01 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 开发环境: Windows XP + VC6+Platform SDK 或者 VS.NET 2003+测试环境: Windows XP曾经以为获取一个窗口的窗口过程很简单,不就是GetWindowLong一下吗,如何获取其它进程中窗口的窗口过程,看spyxx获取的多么顺利,后来才发现原

本文示例源代码或素材下载

开发环境: Windows XP + VC6+Platform SDK 或者 VS.NET 2003+

测试环境: Windows XP

曾经以为获取一个窗口的窗口过程很简单,不就是GetWindowLong一下吗,看spyxx获取的多么顺利。后来才发现原来不是这么简单。获取本进程内窗口的窗口过程确实很简单,直接调用GetWindowLong(hWnd,GWL_WNDPROC)就可以了(注意,根据窗口是否是Unicode的,你要判断是调用GetWindowLongA,还是GetWindowLongW,可以用IsWindowUnicode来判断), 但是GetWindowLong这个函数内部会检查调用进程和该窗口句柄是否属于同一进程,如果不是,就简单的返回0了。

既然这样,我们又不能去修改GetWindowLong,那就只有想办法让它认为我们和那个窗口是在一个进程里了。回想起Windows核心编程里讲过,通过创建远程线程的方式,可以在其它进程内创建一个新的线程,并且可以指定这个线程的线程函数。因为Windows的进程之间的地址相互之间是不可见的,所以我们不能指定本地的线程函数,而要在远程分配内存,把我们要做的事情以机器码的形式写进去。

(spyxx是怎么做的呢?它启动时安装了一个全局的钩子WH_GETMESSAGE,这样,几乎所有有消息循环的程序都会加载它的hook dll,从而可以在其它进程的地址空间里调用GetWindowLong,如果我们仅仅为了获取一下窗口过程装一个全局钩子,未免有点儿太浪费了:))

先来分析一下我们的线程函数都需要做什么。

首先,需要调用GetWindowLong获取这个窗口的窗口过程,然后要告诉我们。可以用PostMessage或者PostThreadMessage的方式通知我们的程序。具体如下所示:

//hWndTarget是我们要获取其窗口过程的窗口句柄, 假设 hWndTarget = 0x12345678
//dwThreadId是我们的线程Id          ,假设 dwThreadId = 0x5678
LONG wndProc = GetWindowLong(hWndTarget,GWL_WNDPROC);
PostThreadMessage(dwThreadId,WM_MYMESSAGE,(WPARAM)hWndTarget,(LPARAM)wndProc);

因为这个时候函数的参数我们都已经知道了,所以可以直接硬编码到程序里。先看一下GetWindowLongA的函数原型:

1 2 3  下一页

Tags:如何 获取 其它

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接