这些相关的东西,起源于工作中遇到的一个简单的问题:如何在一个对话框,通过程序,按下另一个对话框(另一个程序)上的当前焦点的按钮。

  假设控制的对话框叫DlgA,被控制的对话框叫DlgB。

  1、原先的设想:

    (1)在DlgA里,用FindWindow(NULL,"DlgB"),得到DigB的hWnd;

    (2)用CWnd *pWnd = FromHandle(hWnd),得到DlgB的CWnd指针;

    (3)pWnd->GetFocus(),得到焦点按键的hWnd;

    (4)PostMessage(hWnd,BM_CLICK,0,0);

    但是在调试中发现,(3)中,得到的hWnd为0,查到的原因是,在WIN32中,所有的程序所处的内    存空间都是独立的,由于DlgA,DlgB不在同一个空间内,所以这么调用是得不到预想的结果的。

  2、解决方法:

  查了一些资料,觉得可以用SetWindowsHookEx挂钩子和所谓的跨进程子类化的方法解决。

  (1)SetWindowsHookEx:可以将钩子过程和安装钩子程序做在一个动态链接库里,然后SetWindowsHookEx可以将该DLL注入到DlgB的进程空间里。

  (2)这样在钩子过程里就可以调用第1点的(2)(3)(4)步,完成预想的功能了。当然也可以用SetWindowLong这些方法来做一些特别的消息响应,只是我要实现的功能比较单一,所以这里并没有这么做。

 

  一些注意的地方:

  (1)用VS2005调试,估计由于调试的DLL注入了另一个进程空间,所以在DLL程序里设置断点并不会被触发。

  (2)子类化的意思我感觉是:用程序方法,改变一个对象的某些特点,响应等,使对象与原先的定义有所变化。

  (3)在DlgB被注入后,用一些进程查看工具,可以看到钩子DLL已被注入到该进程中。我是用CProcess.exe看的,好像很多工具都有类似功能。

  (4)在WINCE下,微软不推荐用该函数,但实际上也可以用。