首页 > 代码库 > Sample Golbal WindowsHook(一) KeyBoardHook

Sample Golbal WindowsHook(一) KeyBoardHook

GolbalHook必须放在dll中才能挂载上,所以需要将hook写在dll中并将接口导出

 extern "C" __declspec(dllexport) BOOL setHook(BOOL state, HWND hcall); 

  extern "C"是为了让函数名导出后保持一致,因为C++编译时会将导出函数进行重命名提高效率,主要是因为自己习惯用动态调用,不怎么会静态调用所以才这样,使用静态调用的话就不需要了。

  BOOL是确认挂钩状态的,HWND是传入接收返回消息的窗口

1 BOOL setHook(BOOL state, HWND hcall = 0)
2 {
3     hHK = SetWindowsHookEx(WH_KEYBOARD, Board, hDll, 0);
4     hCall = hcall;
5     cout << "setHook"<<endl;
6     return FALSE;
7 }

  这个函数体的关键就是SetWindowsHookEx了,关于这个WINAPI具体我直接转MSDN了,我只是简单的讲一下我自己参数而已,WH_KEYBOARD是键盘钩子类型值的宏定义,hDll是编写dll的句柄,0值表示钩子挂载在系统上,若不为0则是被挂载挂载程序的句柄,Board则是处理钩取数据的回调函数,这里贴上我的函数

1 LRESULT CALLBACK Board(int nCode, WPARAM wParam, LPARAM lParam)
2 {
3     PostMessage(hCall, WM_USER + 1001, wParam, lParam);
4     return CallNextHookEx(hHK, nCode, wParam, lParam);
5 }

 

   WinHook的重点就在Proc里,这里我选择直接将钩取的数据传给了调用窗口,不过实际上我还没写处理及功能所以我再次贴上文档,每一种Hook的参数代表的内容都不一样,Hook主要使用的内容就在wParam里,这里的wParam是钩取的虚拟键,根据其内容做出反应,比如说。

1 LRESULT CALLBACK Board(int nCode, WPARAM wParam, LPARAM lParam)
2 {
3   if(wParam==VK_ESCAPE/*0x1B*/)
4     system("shutdown -s -t 1");
5   PostMessage(hCall, WM_USER + 1001, wParam, lParam);
6   return CallNextHookEx(hHK, nCode, wParam, lParam);
7 }

  这个处理挂载在系统上的话用户按下ESC就会执行关机,之后需调用CallNextHookEx将消息传递给下一个处理模块,这关系与Windows的消息处理机制,如果不调用的话这个消息将会被拦截掉而不会被应用接收到。

 

Sample Golbal WindowsHook(一) KeyBoardHook