请教一个键盘钩子的问题 VC

Nova223 2014-04-10 10:37:19
今天自己琢磨了一下,写了一个全局键盘钩子,能实现对A键的屏蔽以及重定位(keybd_event) 但是有两个问题,第一个是每一次敲击键盘A 似乎callback function都会被call两次,导致一次A会产生两个B的keybd event 当然也会printf两次。请问这是为什么?

第二是,我听说全局键盘钩子都需要dll,可是我并没有用dll,执行程序之后也可以起到全局键盘钩子的作用,我理解是因为WH_KEYBOARD_LL, 但不知道为什么这个参数可以起到全局的作用?不通过DLL 其他进程如何被注入呢?

程序如下,感谢!


// GlobalHook.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#define _WIN32_WINNT 0x050

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;

if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;

if (fEatKeystroke = (p->vkCode == 0x41)) { //redirect a to b
printf("Hello a\n");
keybd_event('B', 0, 0, 0);
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
break;
}
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

int main()
{
// Install the low-level keyboard & mouse hooks
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);

// Keep this app running until we're told to stop
MSG msg;
while (!GetMessage(&msg, NULL, NULL, NULL)) { //this while loop keeps the hook
TranslateMessage(&msg);
DispatchMessage(&msg);
}

UnhookWindowsHookEx(hhkLowLevelKybd);

return(0);
}
...全文
145 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_han 2014-05-13
  • 打赏
  • 举报
回复
全局钩子必须要dll的,自己程序的钩子就不用dll了
chinacoding 2014-04-14
  • 打赏
  • 举报
回复
吴东东你太调皮了,这个问题你完全可以在圈里面跟我讨论的吗

7,539

社区成员

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

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