MFC 钩子使用实例 MFC 钩子是一种强大且灵活的机制,允许开发者截获和处理系统级别的消息。钩子可以用来截获鼠标消息、键盘消息等,从而实现对系统行为的控制。本文将详细介绍 MFC 钩子的使用实例,包括截获鼠标消息、键盘消息和特殊键盘按键的实现。 一、截获鼠标消息 在 MFC 中,可以使用 SetWindowsHookEx 函数来安装钩子,以截获鼠标消息。在 OnInitDialog 函数中添加以下代码: ```c SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId()); ``` 其中,WH_MOUSE 表示要截获的消息类型,MouseProc 是钩子过程函数,NULL 表示当前线程的句柄,GetCurrentThreadId() 表示当前线程的 ID。 在 MouseProc 函数中,可以根据需要截获鼠标消息,并返回 1,以截获消息。 ```c LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) { return 1; } ``` 二、截获键盘消息 要截获键盘消息,需要安装键盘钩子。需要在 OnInitDialog 函数中安装钩子: ```c SetWindowsHookEx(WH_KEYBOARD, KeyProc, NULL, GetCurrentThreadId()); ``` 其中,WH_KEYBOARD 表示要截获的消息类型,KeyProc 是钩子过程函数。 在 KeyProc 函数中,可以根据需要截获键盘消息,并返回 1,以截获消息。 ```c LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam) { if (VK_SPACE == wParam) return 1; else return CallNextHookEx(g_KeyHook, nCode, wParam, lParam); } ``` 三、截获特殊键盘按键 要截获特殊键盘按键,需要在 KeyProc 函数中添加相应的逻辑。例如,要截获 Alt+F4 键,可以使用以下代码: ```c LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam) { if (VK_F4 == wParam && (1 == (lParam >> 29 & 1))) return 1; else return CallNextHookEx(g_KeyHook, nCode, wParam, lParam); } ``` 四、实现按下 F2 键时退出程序 要实现按下 F2 键时退出程序,需要在 KeyProc 函数中添加相应的逻辑。例如: ```c LRESULT CALLBACK KeyProc(int nCode, WPARAM wParam, LPARAM lParam) { if (VK_F2 == wParam) { ::SendMessage(g_hWnd, WM_CLOSE, 0, 0); UnhookWindowsHookEx(g_KeyHook); UnhookWindowsHookEx(g_MouseHook); } else return CallNextHookEx(g_hHook, nCode, wParam, lParam); } ``` 五、安装全局钩子 要安装全局钩子,需要将钩子函数写到 DLL 中,然后使用 LoadLibrary 函数加载 DLL,并使用 SetWindowsHookEx 函数安装钩子。 ```c HMODULE hHandle = LoadLibrary(L"hook.dll"); if (NULL == hHandle) { MessageBox(L"错误"); return; } else { g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetProcAddress(hHandle, "KeyProc"), hHandle, 0); } ``` MFC 钩子提供了强大且灵活的机制来截获和处理系统级别的消息,开发者可以根据需要实现各种功能。












