您的位置:首页 > 其它

子类调用的一些总结

2005-10-20 18:21 204 查看
今天遇到个问题:VB中的子类技术(Sub-Class)。经过查阅一些资料了解到,这是一种挂钩技术(Hook)。主要通过两个API来实现,CallWindowProc和SetWindowLong。
SetWindowLong函数的作用是在窗口结构中为指定的窗口设置属性,利用它我们来改变窗口的属性参数,其中各个参数的意义如下表所示:
参数 意义
hwnd Long,欲为其取得信息的窗口的句柄
nIndex Long,这里取GWL_WNDPROC,表示设置该窗口的窗口函数的地址
dwNewLong Long,由nIndex指定的窗口信息的新值
返回值 Long,指定数据的前一个值
CallWindowProc函数的作用是截获发给窗体的消息。会有三种情况:
<1>如果是需要通过程序来处理的消息就通过 WindowProc函数 中的相应语句处理;
<2>如果是要原来的 窗体函数 来处理则把这个消息传递给原窗体函数(其实是指针指向的改变);
<3>如果不是我们需要的消息,也传递给原 窗体函数 来处理。
那么怎么来使用这两个API呢?下面是具体实现,首先申明几个变量
Public Const GWL_WNDPROC = -4'常量参数,函数地址
Public IsHooked As Boolean'是否建立挂钩 --建立后必须UnHook,且不能再次建立
Global lpPrevWndProc As Long'保留原函数地址
Global gHW As Long'保存窗体句柄
'调用SetWindowLong替换窗口gHW中的GWL_WNDPROC消息为WindowProc(WindowProc是自己定义的函数),并且把本次调用的函数地址保留在lpPrevWndProc中
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
'UnHook,将lpPrevWndProc函数替换回去
Dim temp As Long
temp = SetWindowLong(gHW, GWL_WNDPROC,lpPrevWndProc)
'获得传递给原函数的消息(lpPrevWndProc),获得后可根据Msg判断是否是自己需要处理的消息
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'如果是自己需要的就处理,如果不需要处理则返回给原函数处理
WindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, lParam)
通过以上方式我们可以实现用自定义的右键菜单取代系统菜单,实现资源管理器中的拖拽等。
最后使用SetWindowLong这个API来将原来的窗口函数指针换成自己的函数指针,并将原来的窗口函数指针保存下来。这样窗口消息就可以发到我们自己的函数里来,并且我们随时可以用CallWindowProc来调用前面保存下来的窗口指针,以调用原来的窗口函数。这样,我们可以在不破坏原有窗口功能的前提下处理钩入的消息。这样我们可以实现比如"外部调用内部的函数指针",从VB调用C,C++函数等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐