End If hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _ MyKBHFunc, App.Hinstance, 0) If hnexthookproc <> 0 Then EnableKBDHook = hnexthookproc End If End Function Public Function MyKBHFunc(ByVal iCode As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long '这三个叁数是固定的,不能动,而MyKBHFunc这个名称只要和 'SetWindowsHookex()中 AddressOf後的名称一样便可,不一定叫什麽 MyKBHFunc = 0 If iCode < 0 Then MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam) Exit Function End If If wParam = vbKeySnapshot Then '侦测 有没有按到PrintScreen键 MyKBHFunc = 1 Debug.Print "haha" End If End Function '以下程式於Form Private Sub Form_Load() Call EnableKBDHook End Sub
Private Sub Form_Unload(Cancel As Integer) Call UnHookKBD End Sub ***************************************************************************** 七、自订型态的传递
因这只要用ByRef的方式来做就没有什麽大的问题,故不做说明。
八、综合应用
我们再以一个实例来说明Win API在VB5中呼叫的技巧。有一个函式叫CopyMemory 的宣告如下:
----------------------------------------------------------------------------- Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _ lpvDest As Any, lpvSource As Any, ByVal cbCopy as Long) -----------------------------------------------------------------------------
这个函式可以将 lpvDest的momory copy 到lpvSource上去,cbCopy则代表要copy 多少个byte。有了这个函式,我们可以知道一个Double值存在Memory中的各个byte到底 是多少。
----------------------------------------------------------------------------- Dim dbl as Double Dim bte(0 to 7) as Byte Dbl = 168.256 CopyMemory dbl, byt(0), 8 -----------------------------------------------------------------------------
如此检视bte阵列便可以知道这Double值的各个byte是多少。再以另一个 JournalRecord Hook为例来说明:
范例六 ***************************************************************************** ' 以下在Hook.bas Const WM_MOUSELAST = &H209 Const WM_MOUSEFIRST = &H200 Public Const WM_KEYLAST = &H108 Public Const WM_KEYFIRST = &H100 Public Const WH_JOURNALRECORD = 0 Type EVENTMSG message As Long paramL As Long paramH As Long time As Long hwnd 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 Lon上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页
|