首页
社区
课程
招聘
[求助]关于键盘钩子的一个奇怪问题
发表于: 2009-2-24 00:02 4609

[求助]关于键盘钩子的一个奇怪问题

2009-2-24 00:02
4609
我写了一个简单的全局键盘钩子, 然后用一个对话框来安装钩子, 每当钩子钩到键盘按键消息后, 就往安装它的对话框发自定义消息,并把按键字符传给对话框, 对话框负责显示收到的字符:
钩子过程的代码如下:
HookProc  proc _dwCode, _wParam, _lParam       
        LOCAL @szKeyState[256]:byte
        invoke CallNextHookEx, hHook, _dwCode, _wParam, _lParam
        invoke GetKeyboardState, addr @szKeyState
        mov ecx, _lParam
        shr ecx, 16
        invoke ToAscii, _wParam, ecx, addr @szKeyState, addr szAscii, 0
        mov byte ptr szAscii[eax], 0
        invoke PostMessage, hwnd, dwMessage, dword ptr szAscii, 0
        xor eax, eax
        ret
HookProc endp

当只启动一个对话框安装钩子的时候, 完全正常, 当按下键盘后, 对话框就显示了当前的按键。
但是如果启动相同的好几个对话框来安装钩子的话, 就出现了奇怪的现象:如果启动A, B, C三个同样的对话框, 照我原来的设想, 如果这是按下‘q', 那么A,B,C三个对话框将都会出现字符'q', 可是却发现,钩子只向其中当前对话框发消息, 也就是如果当前对话框是A, 那么按下了'q',就只有对话框A会显示,而且是同时显示三个'q'. 而且如果当前对话框切换到B, 那么以后的按键就全在B中显示了。
问题是 invoke PostMessage, hwnd, dwMessage, dword ptr szAscii, 0 这句话中的hwnd是根据启动对话框不同而传过来的不同的句柄, 为什么最终会传给同一个对话框呢?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一个。
2009-2-24 12:23
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
这是当然的吧,你使用的是同一个变量,这样操作的话,你前面创建的hwnd会被后面创建的hwnd替换掉,所以当然每次都只发送同一个hwnd了。
2009-2-24 12:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不是, 首先hwnd没有放在共享段, 而且,如果照你的说法, 那么所有的字符都应该发往最后启动的那个窗体。
但是现在的问题是, 如果最后一个启动的是窗体C, 如果我把当前窗口又切换到第一个启动的窗体A, 那么所有的字符又发到A去了, 你说这是为什么?
另外, 窗体的句柄仅仅在每个对话框initial dialog的时候发给钩子, 当窗体被激活的时候并没有发送句柄给钩子, 那为什么钩子里的句柄会随着窗体的激活而变化呢?
2009-2-24 14:09
0
游客
登录 | 注册 方可回帖
返回
//