top
Loading...
拖動沒有標題欄的窗體

程序說明:

這種方法是一種高手方法,同樣是講傳遞給Windows一個鼠標的當前位置是在標題區內,但和(一).(二)不同的地方是前兩個方法是通過SendMessage函數來傳消息給Windows,而這個方法是在Windows的到消息前,通過對WM_NCHITTSET消息的欄截.來判斷當前的鼠標位置,然后作出相應的處理

程序代碼:

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

程序首先調用CallWindowProc,這樣就可以從還回值的知當前的鼠標位置位于那一個區域,接著判斷返回值是否等于HTCLENT(工作區)內,如果是,則將返回值設置成TICAPTION(標題區),這樣就可以瞞過Windows,讓Windows以為鼠標位于標題區內

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

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗