'以下在.Bas
Option Explicit
Public Const WM_MOUSEMOVE = &H200
Public Const WH_MOUSE = 7
Type POINTAPI
X As Long
Y As Long
End Type
Type MOUSEHOOKSTRUCT
pt As POINTAPI
hwnd As Long
wHitTestCode As Long
dwExtraInfo As Long
End Type
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Declare Function SetWindowsHookEx Lib "user32" Alias _
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
(lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Public theForm As Form
Public hHook As Long ' handle of Hook Procedure
Public imgRect As RECT
Sub EnableHook(ctl As Control)
If hHook = 0 Then
imgRect.Top = ctl.Top
imgRect.Left = ctl.Left
imgRect.Right = imgRect.Left + ctl.Width
imgRect.Bottom = imgRect.Top + ctl.Height
hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseHookProc, App.hInstance, App.ThreadID)
End If
End Sub
Sub FreeHook()
Dim ret As Long
If hHook <> 0 Then
ret = UnhookWindowsHookEx(hHook)
hHook = 0
End If
End Sub
Function MouseHookProc(ByVal code As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim mStru As MOUSEHOOKSTRUCT, i As Long
If wParam = WM_MOUSEMOVE Then
CopyMemory mStru, lParam, LenB(mStru)
'mStru.pt的座標是螢幕座標,所以要經轉換成相對於Form的座標
Call ScreenToClient(Screen.ActiveForm.hwnd, mStru.pt)
'不在imgButton之內
If Not (mStru.pt.Y >= imgRect.Top And mStru.pt.Y <= imgRect.Bottom And _
mStru.pt.X >= imgRect.Left And mStru.pt.X <= imgRect.Right) Then
MouseHookProc = 0
Call CallNextHookEx(hHook, code, wParam, lParam)
Call FreeHook
Debug.Print "Out of The Range "
Exit Function
Else
Debug.Print "In The Range"
End If
End If
MouseHookProc = 0 '表示要處理這個訊息
Call CallNextHookEx(hHook, code, wParam, lParam)
End Function
'以下在Form,需一個Command1
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Call EnableHook(Command1)
End Sub
Private Sub Form_Load()
Me.ScaleMode = 3
End Sub
|