mfc中如果不用dll,主程序中直接用SetWindowsHookEx截获其他指定的应用程序的键盘操作应该如何设置参数。

安装鼠标钩子

用到的函数有:

SetWindowsHookExA() //设置钩子

GetModuleHandle() //获取模块句柄

UnhookWindowsHookEx() //关闭钩子

SetDlgItemText() ? //设置控件文本

用到的结构体有:

KBDLLHOOKSTRUCT

步骤一:在XXXXXDlg.cpp顶端定义

#define?WH_KEYBOARD_LL ?13

typedef?struct?tagKBDLLHOOKSTRUCT?{

DWORD vkCode;

DWORD scanCode;

DWORD flags;

DWORD time;

DWORD dwExtraInfo;

}?KBDLLHOOKSTRUCT,?FAR?*LPKBDLLHOOKSTRUCT,?*PKBDLLHOOKSTRUCT;

HHOOK?键盘;

HWND?hwnd;

LRESULT?CALLBACK?LowLevelKeyboardProc(int?nCode,WPARAM?wParam,LPARAM?lParam)

{

//这些就是HOOK代码

LRESULT?lResult?=?CallNextHookEx(键盘,?nCode,?wParam,?lParam);

//PMSG?pmsg?=?(PMSG)lParam;

//这时候pmsg->message就是消息了

CString?I;

I.Format(_T("键盘状态:%d"),wParam);

SetDlgItemText(hwnd,IDC_EDIT3,I);

KBDLLHOOKSTRUCT*?指针=(KBDLLHOOKSTRUCT*)lParam;

I.Format(_T("键代码:%d"),指针->vkCode);

SetDlgItemText(hwnd,IDC_EDIT4,I);

return?FALSE;

}

步骤二:代码写:

hwnd=m_hWnd;

//键盘事件的响应步骤是:

//键盘驱动->系统键盘消息处理->当前进程消息处理->当前窗口消息处理

//WH_KEYBOARD_LL插在系统键盘消息处理前

//而WH_KEYBOARD则插在当前进程消息处理前.

//因此如果你WH_KEYBOARD?hook正确而WH_KEYBOARD_LL?hook得不到想要得结果,那么唯一可能就是你把一些不该过滤的键盘消息给过滤掉了。

键盘?=?SetWindowsHookExA(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),NULL);

步骤三:在类视图XXXXXXDlg->消息->WM_DESTROY写:

UnhookWindowsHookEx(键盘);