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(键盘);