在Windows中,設定鍵盤鉤子很多人都做過,但是在windows Mobile系統中並沒有直接的函數支援。但是我們可以通過使用undocument api來實現。
一、定義參數
- #define WH_KEYBOARD_LL 20
- #define HC_ACTION 0
- typedef LRESULT(CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
- typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
- typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
- typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK);
- typedef struct
- {
- DWORD vkCode;
- DWORD scanCode;
- DWORD flags;
- DWORD time;
- ULONG_PTR dwExtraInfo;
- } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
-
- static _SetWindowsHookExW SetWindowsHookEx;
- static _UnhookWindowsHookEx UnhookWindowsHookEx;
- static _CallNextHookEx CallNextHookEx;
二、實現代碼
LLKeyboardHookCallbackFunction就是回呼函數
- BOOL ActivateKBHook(HINSTANCE hInstance,
- HOOKPROC LLKeyboardHookCallbackFunction)
- {
- //we need to manually load these standard Win32 API calls
- //MSDN states that these aren''t supported in WinCE
- SetWindowsHookEx = NULL;
- CallNextHookEx = NULL;
- UnhookWindowsHookEx = NULL;
- //從 coredll.dll 擷取我們需要的函數
- g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
- if(g_hHookApiDLL == NULL)
- {
- return FALSE;
- }
- else
- {
- SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(
- g_hHookApiDLL, _T("SetWindowsHookExW"));
- if(SetWindowsHookEx == NULL)
- {
- return FALSE;
- }
- else
- {
- g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL,
- LLKeyboardHookCallbackFunction, hInstance, 0);
- if(g_hInstalledLLKBDhook == NULL)
- {
- return FALSE;
- }
- }
- CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL,
- _T("CallNextHookEx"));
- if(CallNextHookEx == NULL)
- {
- return FALSE;
- }
- UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL,
- _T("UnhookWindowsHookEx"));
- if(UnhookWindowsHookEx == NULL)
- {
- return FALSE;
- }
- }
- return TRUE;
- }
-
- BOOL DeactivateKBHook()
- {
- //unload the hook
- if(g_hInstalledLLKBDhook != NULL)
- {
- UnhookWindowsHookEx(g_hInstalledLLKBDhook);
- g_hInstalledLLKBDhook = NULL;
- }
- //unload the coredll.dll
- if(g_hHookApiDLL != NULL)
- {
- FreeLibrary(g_hHookApiDLL);
- g_hHookApiDLL = NULL;
- }
- //we have terminated gracefully
- return TRUE;
- }
三、訊息回呼函數
一般的回呼函數是這麼寫的,BlockKeyList是需要屏蔽的按鍵列表
- int CLoginDlg::BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};
- LRESULT CALLBACK CLoginDlg::LLKeyboardHookCallbackFunction(int nCode,
- WPARAM wParam, LPARAM lParam)
- {
- if(nCode >= HC_ACTION)
- {
- if(wParam == WM_KEYDOWN || wParam == WM_KEYUP
- || wParam == WM_LBUTTONDOWN)
- {
- int countKeyList = ARRAY_SIZEOF(BlockKeyList);
- for(int i=0;i<countKeyList;i++)
- {
- if((((KBDLLHOOKSTRUCT*)lParam)->vkCode) == BlockKeyList[i])
- {
- return TRUE;
- }
- }
- }
- }
- return CallNextHookEx(g_hInstalledLLKBDhook, nCode, wParam, lParam);
- }
Windows Mobile下不使用DLL也可以實現全域鍵盤鉤子)
如果你只是要屏蔽所有按鍵的話可以簡單的使用EnableHardwareKeyboard函數來實現。