如果我正确理解您的问题,您应该忽略挂钩过程中的“注入”关键事件,如下所示:
LRESULT CALLBACK
hook_proc( int code, WPARAM wParam, LPARAM lParam )
{
KBDLLHOOKSTRUCT* kbd = (KBDLLHOOKSTRUCT*)lParam;
// Ignore injected events
if (code < 0 || (kbd->flags & LLKHF_INJECTED)) {
return CallNextHookEx(kbdhook, code, wParam, lParam);
}
...
Update:另外,你必须eat字符并通过 Windows 消息通知某个字符按下的其他例程。
Example:
...
// Pseudocode
if (kbd->vkCode is character) {
if (WM_KEYDOWN == wParam) {
PostMessage(mainwnd, WM_MY_KEYDOWN, kbd->vkCode, 0);
return 1; // eat the char, ie 'a'
}
}
return CallNextHookEx(kbdhook, code, wParam, lParam);
并且,在其他一些模块中,您可以处理 WM_MY_KEYDOWN:
ie, #define WM_MY_KEYDOWN (WM_USER + 1)
并调用将生成新关键事件的适当例程。