我写了一个简单的全局键盘钩子, 然后用一个对话框来安装钩子, 每当钩子钩到键盘按键消息后, 就往安装它的对话框发自定义消息,并把按键字符传给对话框, 对话框负责显示收到的字符:
钩子过程的代码如下:
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是根据启动对话框不同而传过来的不同的句柄, 为什么最终会传给同一个对话框呢?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课