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(键盘);
谢谢你。
不过我怎么觉得这样并不能拦截到其他应用程序的键盘操作呢,我想问的是如何拦截其他程序,不是当前窗口的,能实现吗?
这就是全局拦截其他进程的
SetWindowsHookExA 注意这两句
GetModuleHandle(NULL)
这是拦截全局的 就是其他进程
参考资料: MSDN
WH_KEYBOARD, \\钩子类型,键盘钩子
MyFuncation, \\回调函数地址
NULL, \\实例句柄,设置为空,代表回调函数地址在本模块内
0); \\线程ID,设为0代表监事所有线程
然后在回调函数里面判断当前线程是否是你要截获的进程,是就进行操作,不是就把消息传下去。
广告 您可能关注的内容 |