WinCE 6 下键盘钩子(HOOK)

 1 // 已经写过一个 CE5.0 下的键盘钩子:http://blog.csdn.net/91program/article/details/1961570  
 2 // 前一段时间在坛子看到有人在问 CE6.0 下钩子的实现,有的说不行,有的说行,最后也没有结果  
 3 // 今天试了下,是可以的,包括鼠标的钩子。不过速度上好像是有些问题,待有时间再看看吧。   
 4 // 看代码吧。  
 5   
 6 // KeyBoardHook.h   
 7   
 8 #ifdef KEYBOARDHOOK_EXPORTS  
 9 #define KEYBOARDHOOK_API __declspec(dllexport)  
10 #else  
11 #define KEYBOARDHOOK_API __declspec(dllimport)  
12 #endif  
13   
14 // This class is exported from the KeyBoardHook.dll  
15 class KEYBOARDHOOK_API CKeyBoardHook  
16 {  
17 public:  
18   CKeyBoardHook(void);  
19   // TODO: add your methods here.  
20 };  
21   
22 extern "C" KEYBOARDHOOK_API void InstallKeyBoardHook(void);  
23 extern "C" KEYBOARDHOOK_API void UnKeyBoardHook(void);  
24 extern "C" KEYBOARDHOOK_API LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam);  
  1 // KeyBoardHook.cpp   
  2 // KeyBoardHook.cpp : Defines the entry point for the DLL application.  
  3 //  
  4   
  5 #include "stdafx.h"  
  6 #include "KeyBoardHook.h"  
  7 #include <Pwinuser.h>  
  8   
  9 // 告诉编译器将变量放入它自己的数据共享节中  
 10 #pragma data_seg("KeyHookData")  
 11   
 12 HINSTANCE ghInst = NULL;  
 13 HHOOK ghKeyHook = NULL;  
 14   
 15 #pragma data_seg()  
 16   
 17 // 告诉编译器设置共享节的访问方式为:读,写,共享  
 18 #pragma comment(linker, "/SECTION:KeyHookData,RWS")  
 19   
 20 BOOL APIENTRY DllMain(HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)  
 21 {  
 22   switch (ul_reason_for_call)  
 23   {  
 24   case DLL_PROCESS_ATTACH:  
 25     ghInst = (HINSTANCE)hModule;  
 26     break;  
 27   case DLL_THREAD_ATTACH:  
 28   case DLL_THREAD_DETACH:  
 29   case DLL_PROCESS_DETACH:  
 30     break;  
 31   }  
 32   return TRUE;  
 33 }  
 34   
 35 // This is the constructor of a class that has been exported.  
 36 // see KeyBoardHook.h for the class definition  
 37 CKeyBoardHook::CKeyBoardHook()  
 38 {   
 39   return;   
 40 }  
 41   
 42 extern "C" KEYBOARDHOOK_API void InstallKeyBoardHook(void)  
 43 {  
 44   RETAILMSG(1,(L"[Keyboard HOOK]Install HOOK: 0x%x\r\n",ghInst));  
 45   if(ghInst)  
 46   {  
 47     ghKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, ghInst, 0);  
 48     if(NULL == ghKeyHook)  
 49     {  
 50       RETAILMSG(1,(L"[Keyboard HOOK]HOOK create failed: %d\r\n",GetLastError()));  
 51     }  
 52   }  
 53 }  
 54   
 55 extern "C" KEYBOARDHOOK_API void UnKeyBoardHook(void)  
 56 {  
 57   RETAILMSG(1,(L"[Keyboard HOOK]Uninstall HOOK:0x%x\r\n",ghKeyHook));  
 58   if(ghKeyHook)  
 59   {  
 60     UnhookWindowsHookEx(ghKeyHook);  
 61     ghKeyHook = NULL;  
 62   }  
 63   
 64   ghInst = NULL;  
 65 }  
 66   
 67 // CE6 的键盘 HOOK 的响应速度慢, 原因不明!  
 68 // CallNextHookEx(hKeyHook, nCode, wParam, lParam); //继续传递消息  
 69 // SIP 上仅 Ctl/Shift/CAP/Esc/Backspace 可以处理到  
 70 // key value 17/ 16  / 20/ 27/ 8  
 71 extern "C" KEYBOARDHOOK_API LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)  
 72 {  
 73 #if _DEBUG  
 74   RETAILMSG(1,(L"[Keyboard HOOK]Proc,Code is: %d,Down/Up is: %s\r\n",nCode,256 == wParam ? L"Down" : L"Up"));  
 75 #endif  
 76   
 77   if(HC_ACTION != nCode)  
 78   {  
 79     return CallNextHookEx(ghKeyHook, nCode, wParam, lParam);  
 80   }  
 81   
 82   PKBDLLHOOKSTRUCT pKBHookStruct = (PKBDLLHOOKSTRUCT)lParam;  
 83   RETAILMSG(1,(L"[Keyboard HOOK]vkCode value is: %d\r\n",pKBHookStruct->vkCode));  
 84   RETAILMSG(1,(L"[Keyboard HOOK]scanCode value is: %d\r\n",pKBHookStruct->scanCode));  
 85   RETAILMSG(1,(L"[Keyboard HOOK]dwExtraInfo value is: %d\r\n",pKBHookStruct->dwExtraInfo));  
 86   
 87   if(WM_KEYDOWN == wParam)  
 88   {  
 89     // 响应按键声,并限制需要向上 Post 的 vkCode  
 90     switch(pKBHookStruct->vkCode)  
 91     {  
 92     case VK_UP:  
 93     case VK_DOWN:  
 94     case VK_LEFT:  
 95     case VK_RIGHT:  
 96       break;  
 97     default:  
 98       break;  
 99     }  
100   }  
101   else if (WM_KEYUP == wParam)  
102   {  
103     // 限制需要向上Post的vkCode  
104     switch (pKBHookStruct->vkCode)  
105     {  
106     case VK_UP:  
107     case VK_DOWN:  
108     case VK_LEFT:  
109     case VK_RIGHT:  
110       break;  
111     default:  
112       break;  
113     }  
114   }  
115   
116   // 若注释此句, 则被 HOOK 到的按键不再发到 CE 系统   
117   return CallNextHookEx(ghKeyHook, nCode, wParam, lParam);  // 继续传递消息  
118 }  
119   
120   
121 // 调用示例  
122   
123 // Keyboard hook test  
124 typedef void (*pInstallKeyboardHook)(void);  
125 typedef void (*pUnKeyboardHook)(void);  
126 HINSTANCE ghKeyboardModule = NULL;  
127 pInstallKeyboardHook  InKeyBoardHook = NULL;  
128 pUnKeyboardHook  UnKeyBoardHook = NULL;  
129   
130   
131 ghKeyboardModule = LoadLibrary(L"\\AppStore\\SystemInfo\\KeyBoardHook.dll");  
132 if(ghKeyboardModule)  
133 {  
134   InKeyBoardHook = (pInstallKeyboardHook)GetProcAddress(ghKeyboardModule, L"InstallKeyBoardHook");  
135   UnKeyBoardHook = (pUnKeyboardHook)GetProcAddress(ghKeyboardModule, L"UnKeyBoardHook");  
136 }  
137 if(NULL != InKeyBoardHook)  
138 {  
139   InKeyBoardHook();  
140 }  

 

posted @ 2016-02-22 10:54  91program  阅读(485)  评论(0编辑  收藏  举报