module:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOVE = &H3
Public PreWinProc As LongPublic Function WndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long
Dim hwd As Long
Dim rec As RECT
If msg = WM_MOVE Then
rec.Left = Screen.Width - Width
rec.Top = Screen.Height - Height
rec.Right = Screen.Width
rec.Bottom = Screen.Height
If Left = 0 Then rec.Left = Screen.Width - Width
If Top = Screen.Height Then rec.Top = Screen.Height - Height
If Right = Screen.Width Then rec.Right = Screen.Width
If Bottom = Screen.Height Then rec.Bottom = Bottom
WndProc = CallWindowProc(PreWinProc, hwnd, msg, wparam, lparam)
End Function
窗体中的写法
Private Sub Form_Load()
Dim ret As Long
PreWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, PreWinProc)End Sub
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOVE = &H3
Public PreWinProc As LongPublic Function WndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wparam As Long, ByVal lparam As Long) As Long
Dim hwd As Long
Dim rec As RECT
If msg = WM_MOVE Then
rec.Left = Screen.Width - Width
rec.Top = Screen.Height - Height
rec.Right = Screen.Width
rec.Bottom = Screen.Height
If Left = 0 Then rec.Left = Screen.Width - Width
If Top = Screen.Height Then rec.Top = Screen.Height - Height
If Right = Screen.Width Then rec.Right = Screen.Width
If Bottom = Screen.Height Then rec.Bottom = Bottom
WndProc = CallWindowProc(PreWinProc, hwnd, msg, wparam, lparam)
End Function
窗体中的写法
Private Sub Form_Load()
Dim ret As Long
PreWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, PreWinProc)End Sub
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 LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_MOVE = &H3Global lpPrevWndProc As Long
Global gHW As LongPublic Sub Hook(ChWnd As Long)
gHW = ChWnd
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf gWindowProc)
End SubPublic Sub Unhook()
Call SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End SubPublic Function gWindowProc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_MOVE Then
'你想干什么?
gWindowProc = True
Else
gWindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, lParam)
End If
End Function窗体内:
Private Sub Form_Load()
Call Hook(mw.hwnd)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Unhook
End Sub
在模块中
Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOVE = &H3
Public Const WM_SIZE = &H5
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
Global lproc As Long
Function DialogProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'该函数为Form的窗口处理函数。
Select Case uMsg
Case WM_MOVE
Form2.Move Form1.Left, Form1.Top + Form1.Height
Case WM_SIZE
Form2.Move Form1.Left, Form1.Top + Form1.Height
Case Else
DialogProc = CallWindowProc(lproc, hwnd, uMsg, wParam, lParam)
End Select
End Function
sub Main()
form1.show
end sub
'--------------------------------------------------------------------
在form1中
Option Explicit
Private Sub Form_Load()
Form2.Show
lproc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf DialogProc)
End Sub
如果这样就有问题的话,去打补丁!
http://expert.csdn.net/Expert/topic/2861/2861709.xml?temp=.7868463
你试试看吧!!!在模块中写道:Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&)Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePublic Const GWL_WNDPROC = (-4)
Public Const WM_MOVING As Long = &H216Global lpPrevWndProc As Long
Global gHW As LongDim myRc As RECTPublic Sub Hook(ChWnd As Long)
gHW = ChWnd
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf gWindowProc)
End SubPublic Sub Unhook()
Call SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End SubPublic Function gWindowProc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_MOVING Then
CopyMemory myRc, ByVal lParam, 40&
myRc.Top = 250
myRc.Left = 180
CopyMemory ByVal lParam, myRc, 40&
gWindowProc = True
Else
gWindowProc = CallWindowProc(lpPrevWndProc, hWnd, Msg, wParam, lParam)
End If
End Function