VB 键盘拦截怎样激活?
vb设计,如何拦截键盘,我在网上查了半天,所查结果不是被API函数的复杂烦琐弄得云里雾里,就是语法出错根本运行不了。但这一段代码相比之下,比较简单,也完全可以运行:Pub...
vb设计,如何拦截键盘,我在网上查了半天,所查结果不是被API函数的复杂烦琐弄得云里雾里,就是语法出错根本运行不了。但这一段代码相比之下,比较简单,也完全可以运行:
Public hHook As Long
Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <> 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)
End Function
Public Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
MyKBHFunc = 0 '表示要处理这个讯息
If wParam = vbKeySnapshot Then '侦测 有没有按到PrintScreen键
MyKBHFunc = 1 '在这个Hook便吃掉这个讯息
End If
Call CallNextHookEx(hHook, iCode, wParam, lParam) '传给下一个Hook
End Function
但现在的问题是,代码一运行,键盘就被拦截了(实际上也只在VB环境里拦截,对于其它应用程序根本无效)。我想请教的是:如何改造这段代码,使之在我设计的某个事件过程里激活,完成任务后又可以解除拦截? 展开
Public hHook As Long
Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <> 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)
End Function
Public Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
MyKBHFunc = 0 '表示要处理这个讯息
If wParam = vbKeySnapshot Then '侦测 有没有按到PrintScreen键
MyKBHFunc = 1 '在这个Hook便吃掉这个讯息
End If
Call CallNextHookEx(hHook, iCode, wParam, lParam) '传给下一个Hook
End Function
但现在的问题是,代码一运行,键盘就被拦截了(实际上也只在VB环境里拦截,对于其它应用程序根本无效)。我想请教的是:如何改造这段代码,使之在我设计的某个事件过程里激活,完成任务后又可以解除拦截? 展开
3个回答
展开全部
那个代码已经写的很明确了,当你在某个事件里面想启用Hook的时候就调用EnableKBDHook,想解除的时候就调用UnHookKBD。
不过这个拦截无法对其它程序有效。因为你做的只是本程序的钩子,不是全局钩子,全局钩子需要写在DLL里面,EXE是不行的。
______________________________________________
补充,To 楼上aspd199:
该怎么说你呢……你好歹试试自己的代码再说吧。
不懂的人我见多了,但是请不要在自己都不太懂的时候去说别人不懂。
MSDN上的原文:
The system hooks are a shared resource, and installing one affects all applications. All system hook functions must be in libraries. System hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove the hook procedure.
如果aspd199你还看不懂我再多说两句:
Win32的地址空间是独立的,每个程序有自己的地址空间,你设置的钩子函数地址时使用的AddressOf运算符得到的是你当前进程中的地址,在其它进程中此地址处根本就不是一个hook处理函数,会导致出错。你必须要保证你的函数在所有进程中都可见才可以处理全局钩子,所以我才说你得把你的函数放在DLL中映射到公共地址空间才可以让别人看到。当然有人说可以通过强行注入远程代码来解决,也行,只要你不觉得麻烦以及不稳定的话。但是不管如何显然不是你在API中改个参数就能解决的。
有机会多去看看Windows操作系统原理吧,不要觉得知道了几个API的用法就很了不起了,要戒骄戒躁,踏实点。
不过这个拦截无法对其它程序有效。因为你做的只是本程序的钩子,不是全局钩子,全局钩子需要写在DLL里面,EXE是不行的。
______________________________________________
补充,To 楼上aspd199:
该怎么说你呢……你好歹试试自己的代码再说吧。
不懂的人我见多了,但是请不要在自己都不太懂的时候去说别人不懂。
MSDN上的原文:
The system hooks are a shared resource, and installing one affects all applications. All system hook functions must be in libraries. System hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove the hook procedure.
如果aspd199你还看不懂我再多说两句:
Win32的地址空间是独立的,每个程序有自己的地址空间,你设置的钩子函数地址时使用的AddressOf运算符得到的是你当前进程中的地址,在其它进程中此地址处根本就不是一个hook处理函数,会导致出错。你必须要保证你的函数在所有进程中都可见才可以处理全局钩子,所以我才说你得把你的函数放在DLL中映射到公共地址空间才可以让别人看到。当然有人说可以通过强行注入远程代码来解决,也行,只要你不觉得麻烦以及不稳定的话。但是不管如何显然不是你在API中改个参数就能解决的。
有机会多去看看Windows操作系统原理吧,不要觉得知道了几个API的用法就很了不起了,要戒骄戒躁,踏实点。
展开全部
楼上明显就是不懂钩子的人. 全局钩子不是必须写DLL的,EXE也可以直接做到
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)
这句代码替换成以下代码即为全局
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, 0)
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)
这句代码替换成以下代码即为全局
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, 0)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
拦截全局键盘不用API,,,纯搞笑呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询