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环境里拦截,对于其它应用程序根本无效)。我想请教的是:如何改造这段代码,使之在我设计的某个事件过程里激活,完成任务后又可以解除拦截?
展开
 我来答
果建翼
2010-06-18 · TA获得超过7923个赞
知道大有可为答主
回答量:1684
采纳率:0%
帮助的人:2431万
展开全部
那个代码已经写的很明确了,当你在某个事件里面想启用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的用法就很了不起了,要戒骄戒躁,踏实点。
aspd199
2010-06-18 · TA获得超过906个赞
知道小有建树答主
回答量:865
采纳率:50%
帮助的人:487万
展开全部
楼上明显就是不懂钩子的人. 全局钩子不是必须写DLL的,EXE也可以直接做到

hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, App.ThreadID)

这句代码替换成以下代码即为全局

hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, 0)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
无敌闹闹i
2010-06-20 · TA获得超过328个赞
知道答主
回答量:137
采纳率:0%
帮助的人:81.8万
展开全部
拦截全局键盘不用API,,,纯搞笑呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式