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

解决方案 »

  1.   

    放到模块里~!~!~模块代码: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 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
      

  2.   

    增加窗体form1、form2;模块modules  
    在模块中  
     
    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  
      

  3.   

    你先试试把我第一次贴出来的代码MARK了!~
    如果这样就有问题的话,去打补丁!
      

  4.   

    看看这里~
    http://expert.csdn.net/Expert/topic/2861/2861709.xml?temp=.7868463
      

  5.   

    没饭吃,试了一试~把窗体限死在Top=250 Left=180的位置上!!
    你试试看吧!!!在模块中写道: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