猛然看见楼上说什么“子类”,竟愣了半天没想起来是个什么玩意,好象似相识,翻出笔记,才找到这么一小段,可能说的不对,也请高手指正。 1、一般情况下,你的程序要建一个模块(具体原因下面讲),里面粘上如下代码,这一部分是所谓子类所必须的,一般不用去变。 Declare Function CallWindowProc Lib "user32" Alias _ "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _ ByVal hwnd As Long, ByVal Msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongDeclare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = -4 Global lpPrevWndProc As Long Global gHW As Long Public Sub Hook() lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _ AddressOf WindowProc) End SubPublic Sub Unhook() Dim temp As Long temp = SetWindowLong(gHW, GWL_WNDPROC, _ lpPrevWndProc) End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As _ Long, ByVal wParam As Long, ByVal lParam As Long) As _ Long '等会要加代码的地方 End Function 可能比较长,直接粘上就可以了。 2、那个gHW是指窗体的句柄(HWnd),请在窗体的LOAD的事件中加上如下语句: gHW=Me.HWnd 3、里面的过程HOOK由你的程序在开始时调用,UNHOOK在程序结束时调用,用来释放前面的HOOK。 HOOK加在刚才gHW=Me.HWnd的后面,而UNHOOK加在窗体的UNLOAD事件里。 4、在模块里的WindowProc是用来处理窗体上所发生的消息的。里面的参数含义是和SENDMESSAGE里的参数应该是对应一样的。特别是uMsg正是我们要捕获的“消息”。 5、如你的要求要捕获点击标题栏的消息,这个消息对应的值是WM_NCLBUTTONDOWN = &HA1 所以只要在WindowProc过程里加上这样的代码即可: IF uMsg=&HA1 THEN DEBUG.PRINT "标题栏单击" 当然也可以在THEN的后面加上你想触发的过程.(窗体上的单击对应的值是WM_LBUTTONDOWN = &H201)注:说了一通,其实就是高手们常说的什么“钩子”,不仅可以捕获本程序的消息,还可以捕获一切WINDOWS消息,但前者只要讲HOOK的过程做在程序的模块里就行了(就是前面所讲的),而后者一定要把消息捕获放在DLL里,这对VB有些困难,不在话下。最后提醒,用完后一定要释放“钩子”(UNHOOK)。
1、一般情况下,你的程序要建一个模块(具体原因下面讲),里面粘上如下代码,这一部分是所谓子类所必须的,一般不用去变。
Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As LongDeclare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = -4
Global lpPrevWndProc As Long
Global gHW As Long
Public Sub Hook()
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
AddressOf WindowProc)
End SubPublic Sub Unhook()
Dim temp As Long
temp = SetWindowLong(gHW, GWL_WNDPROC, _
lpPrevWndProc)
End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As _
Long
'等会要加代码的地方
End Function
可能比较长,直接粘上就可以了。
2、那个gHW是指窗体的句柄(HWnd),请在窗体的LOAD的事件中加上如下语句:
gHW=Me.HWnd
3、里面的过程HOOK由你的程序在开始时调用,UNHOOK在程序结束时调用,用来释放前面的HOOK。
HOOK加在刚才gHW=Me.HWnd的后面,而UNHOOK加在窗体的UNLOAD事件里。
4、在模块里的WindowProc是用来处理窗体上所发生的消息的。里面的参数含义是和SENDMESSAGE里的参数应该是对应一样的。特别是uMsg正是我们要捕获的“消息”。
5、如你的要求要捕获点击标题栏的消息,这个消息对应的值是WM_NCLBUTTONDOWN = &HA1
所以只要在WindowProc过程里加上这样的代码即可:
IF uMsg=&HA1 THEN DEBUG.PRINT "标题栏单击"
当然也可以在THEN的后面加上你想触发的过程.(窗体上的单击对应的值是WM_LBUTTONDOWN = &H201)注:说了一通,其实就是高手们常说的什么“钩子”,不仅可以捕获本程序的消息,还可以捕获一切WINDOWS消息,但前者只要讲HOOK的过程做在程序的模块里就行了(就是前面所讲的),而后者一定要把消息捕获放在DLL里,这对VB有些困难,不在话下。最后提醒,用完后一定要释放“钩子”(UNHOOK)。