---------------- 有没有注意到第三个参数它是一个 ByVal的Long,指的是存放某一个EVENTMSG的位址, 而先前我们提过,自定型态的参数传递要使用ByRef的方式才能解决,天啊!它用ByVal 的方式来做,如果是C语言,那不成问题,只要如下:
----------------------------------------------------------------------------- EVENTMSG *p; P = (EVENTMSG *) lParam; ----------------------------------------------------------------------------- 如此便可以用 *p->message 之方式来取得内容,但VB呢?这里便要用些小技巧了,试 想,如果我们能依lParam所指的位址,一个Byte一个Byte的Copy到一个EVENTMSG的变 数 上面,不就可以了吗?所以了, CopyMomory这个函式派上用场了,但是 CopyMomory的 原始宣告如下,前面两个参数都是ByRef的方式,但目前对我们有的是lParam的内容(假 设是lParam = 25600, Address of lParam = 100100),如果我们使用底下的宣告,而去 呼叫 -- 宣告一 ---------------------------------------------------------------------- Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _ lpvDest As Any, lpvSource As Any, ByVal cbCopy as Long)
CopyMomory msg , lParam, Lenb(msg) ----------------------------------------------------------------------------- 那麽WinAPI RtlMoveMemory会得到第二个参数值=100100,而使指标指到100100的位址 ,那麽就得不到想要的资料了 (因资料在25600的位址上)。所以我们改变原始宣告,将 之变成宣告二的样子,如此VB 第二个参数的作法会传出25600(因为ByVal嘛)给RtlMoveMe mory,那不就成功了吗?
----宣告二 --------------------------------------------------------------------- Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _ lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy as Long)
CopyMomory msg , lParam, Lenb(msg) ----------------------------------------------------------------------------- 或许这RtlMoveMemory您在许多地方都会用上,前两个参数时而要ByRef, 时而需 ByVal,那是否就要定义四个宣告来因应不同之需,其实也不用,上面的例子中,只要 宣告成宣告一的样子,但是呼叫时改成:
CopyMemory msg, ByVal lParam, Lenb(msg)
在第二个参数前加上ByVal这样这可以了啦。
这里还有另外一个做法,那就是从Hook Procedure的宣告著手,别忘了,Hook Pro cedure是Window所呼叫的,所以它传给我们定义的HookProc()时,第三个参数以先前的 举例来说便是传入25600,那麽,我们将HookProc()改定义成:
----------------------------------------------------------------------------- Function HookProc(ByVal code As Long, ByVal wParam As Long, _ lParam As Long) As Long ----------------------------------------------------------------------------- 第三个参数变成 ByRef的方式传入,所以了,用msg = lParam来取代CopyMemory的 作法, 嘛可以通啦!即如下:
----------------------------------------------------------------------------- Function HookProc(ByVal code As Long, ByVal wParam As Long, _ lParam As Long) As Long ''''lParam改成ByRef msg = lParam '''' 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(hHook, code, wParam, lParam) End Function -----------------------------------------------------------------------------
上一页 [1] [2] [3] |