标签:nload shutdown 关机 ram library bool color window esc
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
标签:nload shutdown 关机 ram library bool color window esc
原文地址:http://www.cnblogs.com/DecepH/p/KeyBoardHook.html