我想当鼠标在form标题栏(Caption)上面时,执行一段代码,如何实现?

解决方案 »

  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_NCMOUSEMOVE = &HA0
    Public PrevProc As Long
    Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
        If uMsg = WM_NCMOUSEMOVE Then
            Debug.Print "鼠标在标题栏移动"
        End If
    End Function窗体代码:Private Sub Form_Load()
        PrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Me.hwnd, GWL_WNDPROC, PrevProc
    End Sub
      

  2.   

    頂過
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  3.   

    to  yachong(蚜虫) :这种用法,会不会象计时器一样,占资源大呢?
      

  4.   

    我想应该不会占太大资源,试验一下吧,俺对API不熟
    这个相当于在MouseMove事件里面写代码,所以不适合调用运算量大的函数
    我觉得最好加一个标记,当鼠标在标题栏移动时阻止它频繁地重复调用你的函数
      

  5.   

    WM_NCMOUSEMOVE不止是在标题栏触发的
    当移动到边框,菜单栏等非客户区域的时候也会触发