如何捕获Mid窗体的移动?
以下代码用在普通窗体,可以捕获Form移动事件,
但放到MidForm中就没有用,怎么办?
'Form1
Option Explicit
Private Sub Form_Load()
procOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SysProc) '获得原消息处理句柄,并将消息处理转交自定义函数
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong hwnd, GWL_WNDPROC, procOld
End Sub
'Module1
Option Explicit
Public 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 Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_SYSCOMMAND = &H112
Public Const WM_MOVE = &H3
Public procOld As Long
Public Function SysProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static i As Integer, j As Integer
SysProc = CallWindowProc(procOld, hwnd, iMsg, wParam, lParam)
If iMsg = WM_MOVE Then MsgBox "Move"
End Function
问题点数:200、回复次数:4Top
1 楼cool_man(土豆)回复于 2006-03-11 15:37:08 得分 0
gzTop
2 楼rainstormmaster(暴风雨 v2.0)回复于 2006-03-11 16:32:26 得分 200
呵呵,看你的代码中有 WM_SYSCOMMAND的声明,其实,离目标已经不远了,事实上,不论是移动窗体,还是调整窗题大小都会触发WM_SYSCOMMAND这个消息,所以根据这个消息处理即可,将模块部分修改为:
Option Explicit
Public 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 Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_SYSCOMMAND = &H112
Public Const WM_MOVE = &H3
Public Const SC_MDIMOVE = &HF012&
Public procOld As Long
Public Function SysProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static i As Integer, j As Integer
SysProc = CallWindowProc(procOld, hwnd, iMsg, wParam, lParam)
If iMsg = WM_SYSCOMMAND Then
Select Case wParam
Case 61441, 61442, 61443, 61444, 61445, 61446, 61447, 61448
MsgBox "Sized"
Case SC_MDIMOVE
MsgBox "Moved"
End Select
End If
End Function
下面说说61441、61442 、&HF012&这样一些数是怎么来的,我们可以肯定移动窗口、调整窗题大小都会触发WM_SYSCOMMAND消息,所以,先写上这样一些临时代码:
Public Function SysProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static i As Integer, j As Integer
SysProc = CallWindowProc(procOld, hwnd, iMsg, wParam, lParam)
If iMsg = WM_SYSCOMMAND Then
debug.print Case wParam
End If
End Function
观察debug窗口,就得到了这些值Top
3 楼trademark2004()回复于 2006-03-11 17:26:13 得分 0
什么是midform啊?Top
4 楼fuxc(Michael(继续迷茫))回复于 2006-03-12 11:11:11 得分 0
谢谢暴风雨,
真正的错误还不是你说的这个,
一个低级错误,不好意思讲了,嘿嘿~~~Top




