VB中拖動(dòng)沒有標(biāo)題欄的窗體

字號:

程序代碼:
    Module1
    Option Explicit
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_NCHITTEST = &H84
    Public Const HTCLIENT = 1
    Public Const HTCAPTION = 2
    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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public prevWndProc As Long
    Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
    If Msg = WM_NCHITTEST And WndProc = HTCLIENT Then
    WndProc = HTCAPTION
    End If
    End Function
    程序首先調(diào)用CallWindowProc,這樣就可以從還回值的知當(dāng)前的鼠標(biāo)位置位于那一個(gè)區(qū)域,接著判斷返回值是否等于HTCLENT(工作區(qū))內(nèi),如果是,則將返回值設(shè)置成TICAPTION(標(biāo)題區(qū)),這樣就可以瞞過Windows,讓W(xué)indows以為鼠標(biāo)位于標(biāo)題區(qū)內(nèi)
    Form1
    Option Explicit
    Private Sub Command1_Click()
    Unload Me
    End Sub
    Private Sub Form_Load()
    prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
    SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
    End Sub