''窗体代码:
Option Explicit
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)Private Sub Form_Activate()
''设置窗口为TOPMOST窗口,目的是便于观察
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End SubPrivate Sub Form_Load()
Dim RT As RECT
With RT
.Left = 0
.Right = 10
.Top = 0
.Bottom = 10
End With
EnableHook RT
End SubPrivate Sub Form_Unload(Cancel As Integer)
FreeHook
End Sub''模块代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private 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
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As Long
Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEMOVE = &H200Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Type POINTAPI
x As Long
y As Long
End Type
Private Type MSLLHOOKSTRUCT
pt As POINTAPI
mouseData As Long
Flags As Long
time As Long
dwExtraInfo As Long
End Type
Public hHook As Long
Public hRT As RECTPublic Sub EnableHook(hRect As RECT)
hRT = hRect If hHook = 0 Then
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End If
End SubPublic Sub FreeHook()
If hHook <> 0 Then
Call UnhookWindowsHookEx(hHook)
hHook = 0
End If
End SubPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
Dim typMHS As MSLLHOOKSTRUCT, pt As POINTAPI
If nCode < 0 Then
HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
Exit Function
End If
If wParam = WM_MOUSEMOVE Then 'H200=512
Call CopyMemory(typMHS, ByVal lparam, LenB(typMHS))
pt = typMHS.pt
Debug.Print "lparam: " & lparam
'Debug.Print "x:" & pt.x & "y:" & pt.y
If PtInRect(hRT, pt.x, pt.y) <> 0 Then
HookProc = 1 ''取消原本要完成的動作
Else
Form1.Caption = "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
HookProc = 0 ''令待完成的動作繼續完成
End If
End If
End FunctionDebug.Print "lparam: " & lparam的结果全是“lparam: 1310176”
我看程序代码时,以为lparam就是鼠标经过的坐标及其他信息组成的
问1:如何取得到真正的lparam值
问2:程序知道lparam能得到pt的位置,如果反过来知道pt的位置,如何能算出lparam值
Option Explicit
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
Private Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)Private Sub Form_Activate()
''设置窗口为TOPMOST窗口,目的是便于观察
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
End SubPrivate Sub Form_Load()
Dim RT As RECT
With RT
.Left = 0
.Right = 10
.Top = 0
.Bottom = 10
End With
EnableHook RT
End SubPrivate Sub Form_Unload(Cancel As Integer)
FreeHook
End Sub''模块代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private 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
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As Long
Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEMOVE = &H200Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypePrivate Type POINTAPI
x As Long
y As Long
End Type
Private Type MSLLHOOKSTRUCT
pt As POINTAPI
mouseData As Long
Flags As Long
time As Long
dwExtraInfo As Long
End Type
Public hHook As Long
Public hRT As RECTPublic Sub EnableHook(hRect As RECT)
hRT = hRect If hHook = 0 Then
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End If
End SubPublic Sub FreeHook()
If hHook <> 0 Then
Call UnhookWindowsHookEx(hHook)
hHook = 0
End If
End SubPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
Dim typMHS As MSLLHOOKSTRUCT, pt As POINTAPI
If nCode < 0 Then
HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
Exit Function
End If
If wParam = WM_MOUSEMOVE Then 'H200=512
Call CopyMemory(typMHS, ByVal lparam, LenB(typMHS))
pt = typMHS.pt
Debug.Print "lparam: " & lparam
'Debug.Print "x:" & pt.x & "y:" & pt.y
If PtInRect(hRT, pt.x, pt.y) <> 0 Then
HookProc = 1 ''取消原本要完成的動作
Else
Form1.Caption = "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
HookProc = 0 ''令待完成的動作繼續完成
End If
End If
End FunctionDebug.Print "lparam: " & lparam的结果全是“lparam: 1310176”
我看程序代码时,以为lparam就是鼠标经过的坐标及其他信息组成的
问1:如何取得到真正的lparam值
问2:程序知道lparam能得到pt的位置,如果反过来知道pt的位置,如何能算出lparam值
x=LOWORD(lParam);
y=HIWORD(lParam);