转贴:Windows的子类化处理。 大家都知道,在windows里不管你做了什么事,都会向windows发送一条消息,然后由 Windows作出相应的处理后才会返回给传送消息的应用程序。 那大家会问:“HOOK不是已经拦截了windows消息了吗?” 是啊,那也要看是拦截了什么消息,就如上面我们写的WH_KEYBOARD,我们拦截了键盘消息,我们可以在按下任何一个按键的时候做出处理。消息的种类有很多。 可是我们今天要讲的是windows的子类化处理,这又是一门新的技术。 不废话了,这就开始。^_^ 相信大家都见过两这个API:GetWindowsLong 和 SetWindowLong; 可能你们会说,这些不是处理窗口消息的吗?对,这就是我们要用到的API。 接下来让我们看一下这些API的参数。 LONG GetWindowLong( HWND hWnd, //窗体的句柄 int nIndex //欲取回的信息,可参照下表 ); nIndex的值可以是下列任何一个 GWL_EXSTYLE 扩展窗口样式 GWL_STYLE 窗口样式 GWL_WNDPROC 该窗口的窗口函数的地址 GWL_HINSTANCE 拥有窗口的实例的句柄 GWL_HWNDPARENT 该窗口之父的句柄。不要用SetWindowWord来改变这个值 GWL_ID 对话框中一个子窗口的标识符 GWL_USERDATA 含义由应用程序规定 DWL_DLGPROC 这个窗口的对话框函数地址 DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值 DWL_USER 含义由应用程序规定 也许大家会注意到 GWL_WNDPROC 这个参数。没错,我们子类处理就是要用到这个参数。 代码如下: OldProc:=GetWindowLong(hWnd,GWL_WNDPROC); 这样我们的OldProc就指向窗体的窗口函数地址; 既然得到了窗口函数地址,那么就修改到我们自定义的消息处理地址里吧。 下面要用到SetWindowLong函数了。 LONG SetWindowLong( HWND hWnd, //指定窗口句柄 int nIndex, //和GetWindowLong的nIndex一样 LONG dwNewLong //新的消息处理地址 ); 代码如下: SetWindowLong(hWnd,GWL_WNDPROC,Longint(@WinProc)); 这样就把指定窗体的消息转到了我们的函数内执行; 回调函数如下: Function WinProc(Hwnd,Msg,wParam,lParam:longint):LRESULT; stdcall; begin Result:=CallWindowProc(OldProc,Hwnd,Msg,wParam,lParam); end; 这里的Msg就是窗口的消息,后面赋上消息表。