很多事情。
UnhookWindowsHookEx(int idHook)函数即可实现对挂接钩子的卸载。
l 我们开始写程序吧!用MFC AppWizard建立一个工程名为: KBoardHook基于Dialog base的对话框程序,点击finish。
l 在KBoardHookDlg.cpp的最上边加上
HHOOK hhkLowLevelKybd2000;
hhkLowLevelKybd2000为全局变量。
l 为方便以后的操作预先在CKBoardHookDlg类中利用CLASSWIZARD实现一个响应WM_CREATE和WM_DESTROY消息的函数OnCreate( )与OnDestroy( )的框架,
l 在OnCreate()函数中通过SetWindowsHookEx与系统挂起钩子代码如下
hhkLowLevelKybd2000 = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc, AfxGetApp()->m_hInstance, 0);
l 在OnDestroy()中通过UnhookWindowsHookEx ()解除已经挂起钩子,释放系统资源, 代码如下: UnhookWindowsHookEx(hhkLowLevelKybd2000);
l 这时在KBoardHookDlg.h中声明LowLevelKeyboardProc ,在class CKBoardHookDlg : public Cdialog的上面加入如下代码
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
// 当nCode为0(在winuser.h中有如下定义:#define HC_ACTION 0)时wParam, lParam才包含所应有的键盘信息,wParam的值代表了键盘的消息可以为WM_KEYDOWN
WM_KEYUP, lParam为指向KBDLLHOOKSTRUCT的指针。
l 再在KBoardHookDlg.cpp的最后加入如下代码(这此代码都是手工加入的,不能用ClassWzrd)
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
if (nCode == HC_ACTION) {
int vKey=LOBYTE(p->vkCode);
switch (wParam)
{
case WM_KEYDOWN:
{
if(vKey==27)