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里记录日志
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里记录日志
都是这么写
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
该函数传远程京城怎么就不对呢?比如我要监控某个游戏的按键情况,我就把该游戏的窗体句丙和相关信息传递给该函数,可是就是不能监控,而如果我传递的当前这个应用程序的句丙就没问题
一般都会用子类处理类似消息
况且它也没有传递窗口的句柄参数.