加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么必须将SetWindowsHookEx与Windows消息队列一起使用

发布时间:2020-12-16 02:59:28 所属栏目:百科 来源:网络整理
导读:我一直在尝试一些钩子,我不明白为什么钩子必须与消息队列一起使用 hook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardProc,NULL,0);MSG msg;while(GetMessage(msg,0) 0){ TranslateMessage(msg); DispatchMessage(msg);}UnhookWindowsHookEx(hook); 为什么这
我一直在尝试一些钩子,我不明白为什么钩子必须与消息队列一起使用
hook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardProc,NULL,0);
MSG msg;
while(GetMessage(&msg,0) > 0)
{
        TranslateMessage(&msg);
        DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);

为什么这样的东西不行?

hook = SetWindowsHookEx(WH_KEYBOARD,0);
cin >> aKey;
UnhookWindowsHookEx(hook);

使用升压螺纹,屏障也不起作用.为什么钩子和钩钩之间的等待不能以另一种方式完成?

编辑:

当我创建这个示例时,我做了一个错误,我创建一个WH_KEYBOARD_LL钩子,而不是WH_KEYBOARD,(我不认为它有很大的区别)

此外循环也不会执行只等待GetMessage函数.

循环执行只当我发布退出消息PostThreadMessage(id,WM_QUIT,2323,NULL);所以我不明白在旁边做什么,还有一些内部处理?

有关:

C++ SetWindowsHookEx WH_KEYBOARD_LL Correct Setup

How can I set up a CBT hook on a Win32 console window?

解决方法

低级钩子WH_KEYBOARD_LL和WH_MOUSE_LL与所有其他钩子不同.它们不需要将DLL注入到目标进程中.相反,Windows直接在你自己的进程中调用你的hook回调.要做这个工作,需要一个消息循环.没有其他机制可以让您的主线程进行回调,回调只能在您调用Get / PeekMessage()以使Windows可以控制时发生.

像WH_KEYBOARD这样的全局钩子是非常不同的.它需要一个DLL,并且在处理键盘消息的进程中发生回调.你需要一些进程间的沟通来让自己的程序知道这一点.命名管道是通常的选择.否则当然要求这个注入的过程泵送消息循环.否则不会收到键盘消息.

喜欢一个低级别的钩子,他们更容易去.但是做泵还是不行.请注意超时,如果您的响应不足,Windows将无法通知您.

Understanding the low-level mouse and keyboard hook (win32)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读