关于SetWindowsHookEx使用的几个问题,请高手帮帮我!

tanjunrong123 2004-08-22 09:36:31
程序如下:
(
Public hHook as Long
Private Sub Form_Load()′程序启动时安装钩子
hHook=SetWindowsHookEx(2,Address of MyKBHook,0,App.ThreadID)
End Sub
′具体的钩子程序,本例中该过程被包含在Module1中
Public Function MyKBHook(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long
If nCode>=0 then
Open "C:\Keyfile.txt" For Append As #1 '将键盘的操作记录在Keyfile.txt文件之中
'记录所操作的键、操作时间、日期操作时的按键状态,用16进制记录
Write #1,wParam,Hex(lParam),Date,time
Close #1
MyKBHook=0 '表示要处理这个消息
'屏蔽ALT+F4组合键
if wParam=115 And(lParam And&H20000000)<>0 Then
if(lParam And &HC000000)=0 Then  '是否进行ALT+F4操作
MyHBHook=1 '钩子吃掉这个消息
End if
End if
End if
Call CallNextHookEx(hHook,nCode,wParam,lParam)'将消息传给下一个钩子
End Function
'程序退出时卸载钩子
Private Sub Form_Unload(Cancel As Interger)
Call Unhook WindowsHookEx(hHook)
End Sub
)
有三个问题想请教:
1.将MyHBHook=1后,MyHBHook的值并没有被任何进程或函数所调用到,钩子是怎样吃掉这个消息呢?详细过程是怎样的?
2.CallNextHookEx的具体作用是什么?在该程序中将该条语句去掉好象没多大关系!
3.用钩子该怎样区分是按下了a还是A呢?
我是一位API的初学者,很想将一些细节的问题搞清楚,希望各位高手帮帮我,先谢谢了!
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyl910 2004-08-23
  • 打赏
  • 举报
回复
操作系统也是别人一行一行代码写出来的

1.键盘鼠标钩子的回调函数是在GetMessage内部调用的。GetMessage是用于实现消息循环的(VB封装了消息循环),线程在取得消息的时候会调用GetMessage
2.调用GetKeyState得到Shift键状态,对于输入法就比较麻烦了
3.这种Hook是线程级,跨线程Hook和全局Hook需要将回调函数写在普通dll中(不能是VB的ActiveX DLL,需要用其他编程工具写dll,如VC++、Delphi、Borland C++ Builder)


----------------------------------------------------------------
原贴内容:
zyl910:感谢您的指教,但我想搞清楚他,麻烦帮帮忙?
程序如下:
有三个问题想请教:
1.MyHBHook的值是被系统调用了吗?
2.实现区分是按下了a还是A具体该用何种方法?
3.为何用以上钩子程序时,在CSDN上的登陆后,却抓不到任何信息呢?(我试过了,在其他地方可以,但按一次键后,该键的信息会被保存2到3次,why?)
我是一位API的初学者,很想将一些细节的问题搞清楚,希望各位高手帮帮我,先谢谢了!
thepointer 2004-08-22
  • 打赏
  • 举报
回复
//1.将MyHBHook=1后,MyHBHook的值并没有被任何进程或函数所调用到,钩子是怎样吃掉这个消息
//呢?详细过程是怎样的?

应该是 MyKBHook=1 吧。当钩子回调函数返回一个非零值时,GetMessage/PeekMessage函数将不会把正在处理的键盘消息返回给调用GetMessage/PeekMessage函数的代码,使得窗口过程不会接收到此键盘消息。

//2.CallNextHookEx的具体作用是什么?在该程序中将该条语句去掉好象没多大关系!

调用键盘钩子链中的下一个钩子,如果去掉并且还有其他钩子存在的话,其他钩子有可能不被调用。

//3.用钩子该怎样区分是按下了a还是A呢?

要判断shift/caps lock键的状态。

//但你按一下某键时,系统会记录三次

可以把 If nCode>=0 then 改为 If nCode=0 then
tanjunrong123 2004-08-22
  • 打赏
  • 举报
回复
但你写入a和A时wParam的值都是65呀!而且,但你按一下某键时,系统会记录三次!
zyl910 2004-08-22
  • 打赏
  • 举报
回复
先补充一下
Public Const WH_KEYBOARD As Long = 2


1.钩子是Windows内部编程实现,比如这个WH_KEYBOARD钩子:在消息队列接收到键盘消息时(GetMessage内部),Windows会调用键盘钩子,并根据键盘钩子的返回值决定是否将该消息(从GetMessage调用中)返回
2.CallNextHookEx是用来调用下级钩子链的,主要是为了解决多个钩子同时监测的问题
3.WH_KEYBOARD只监测键盘按下与弹起,具体是a还是A需要判断Shift状态及输入法状态

dongge2000 2004-08-22
  • 打赏
  • 举报
回复
Alt+F4用子类就可屏蔽掉。
dongge2000 2004-08-22
  • 打赏
  • 举报
回复
ascii码的"a" & "A"是不一样滴

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧