Option Explicit
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WH_CALLWNDPROC = 4
Public Const WH_CALLWNDPROCRET = 12
Public Const WH_CBT = 5
Public Const WH_DEBUG = 9
Public Const WH_FOREGROUNDIDLE = 11
Public Const WH_GETMESSAGE = 3
Public Const WH_HARDWARE = 8
Public Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_MSGFILTER = (-1)
Public Const WH_SHELL = 10
Public Const WH_SYSMSGFILTER = 6Public HookId As Long
Public PubHook As clsHookPublic Sub HookFunc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long)
If PubHook Is Nothing Then Exit Sub
Call PubHook.HookEvent(ncode, wParam, lParam)
'  Debug.Print "QryEnd", wParam, lParam
Open "C:\tmp.txt" For Append As #1 'Write #1, wParam, Hex(lParam), Date, Time
Close #1
Call CallNextHookEx(HookId, ncode, wParam, lParam)
End Sub
类模块如下Option Explicit
Public Event HookProcas(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long)Public Function SetHook(Hwnd As Long, Handle As Long, pid As Long, ThreadID As Long) As Long
HookId = SetWindowsHookEx(WH_KEYBOARD, AddressOf HookFunc, App.hInstance, ThreadID)
SetHook = HookId
End Function
Public Sub HookEvent(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long)
RaiseEvent HookProcas(ncode, wParam, lParam)
End Sub
Public Sub UnHook()
UnhookWindowsHookEx (HookId)
End Sub
Public Sub PHook(hook As clsHook)
Set PubHook = hook
End Sub如果选择调用该dll的应用程序的就可以成功,而如果别的程序就没有反应了呢?
好像是关于api地址段的问题,欢迎yy在c盘tmp.txt里记录日志

解决方案 »

  1.   

    或者谁给个能对远程进程进行hook的例子,我看到的都是本地
    都是这么写
    HookId = SetWindowsHookEx(WH_KEYBOARD, AddressOf HookFunc, App.hInstance, app.ThreadID)
    如果是远程的怎么写?
    Public Function SetHook(Hwnd As Long, Handle As Long, pid As Long, ThreadID As Long) As Long
    HookId = SetWindowsHookEx(WH_KEYBOARD, AddressOf HookFunc, App.hInstance, ThreadID)
    SetHook = HookId
    End Function
    该函数传远程京城怎么就不对呢?比如我要监控某个游戏的按键情况,我就把该游戏的窗体句丙和相关信息传递给该函数,可是就是不能监控,而如果我传递的当前这个应用程序的句丙就没问题
      

  2.   

    我想这个游戏一定设置防止HOOK的功能.因此在游戏中进行的键盘消息不一定是通过该游戏窗体发送的.所以就HOOK不到了.
      

  3.   

    不要动不动就用HOOK,现在是人都会HOOK了,做游戏的程序员也不是吃素的啊......
    一般都会用子类处理类似消息
      

  4.   

    SetWindowsHookEx是对应用程序的HOOK.看说明是这样的.
    况且它也没有传递窗口的句柄参数.
      

  5.   

    问个问题扯那么远干嘛我用的是应用程序的ThreadID啊