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) Public hNxtHook As Long ' handle of Hook Procedure Public msg As EVENTMSG
Sub EnableHook() hNxtHook = SetWindowsHookEx(0, AddressOf HookProc, App.hInstance, 0) End Sub Sub FreeHook() Dim ret As Long ret = UnhookWindowsHookEx(hNxtHook) End Sub Function HookProc(ByVal code As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long CopyMemory msg, lParam, Lenb(msg) If (msg.message >= WM_KEYFIRST _ And msg.message <= WM_KEYLAST) Then Debug.Print msg.message, msg.paramH End If HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam) End Function '以下程式於Form1 Private Sub Form_Load() Call EnableHook End Sub
Private Sub Form_Unload(Cancel As Integer) Call FreeHook End Sub *****************************************************************************
详细的流程不多做说明,我们只把重点放在HookProc这个Hook Procedure,如果我 们查JournalRecord Hook的Hook Procedure可得定义如下:
----------------------------------------------------------------------------- LRESULT CALLBACK JournalRecordProc( int code, // hook code WPARAM wParam, // undefined LPARAM lParam // 为一个EVENTMSG Structure的address值 );
这个JournalRecordProc 对应到我们的HookProc便是
Function HookProc(ByVal code As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long
----------------------------------------------------------------------------- 有没有注意到第三个叁数它是一个 ByVal的Long,指的是存放某一个EVENTMSG的位址, 而先前我们提过,自定型态的叁数传递要使用ByRef的方式才能解决,天啊!它用ByVal 的方式来做,如果是C语言,那不成问题,只要如下:
----------------------------------------------------------------------------- EVENTMSG *p; P = (EVENTMSG *) lParam; ----------------------------------------------------------------------------- 如此便可以用 *p->message 之方式来取得内容,但VB呢?这里便要用些小技巧了,试 想,如果我们能依lParam所指的位址,一个Byte一个Byte的Copy到一个EVENTMSG的变数 上面,不就可以了吗?所以了, CopyMomory这个函式派上用场了,但是 CopyMomory上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页
|