其实无论在子线程还是主线程中,设置的钩子都是一样的。但是,如果只是像在主线程中那样调用完SetWindowsHookEx函数就以为没事了,那你有可能什么也钩不到。如果你设置的是鼠标钩子,你还会看到鼠标反应迟顿。这是为什么呢?

前些日子我就遇到过这事,在网上搜了半天也没找到解决方案。无奈,自己仔细研究,找到原因了,非常简单,与大家分享。

答案就是,调用完SetWindowsHookEx后,子线程中要启动消息泵,不能Sleep在那里,也不能因为等待事件而阻塞在任何地方。把下面的代码加到你的子线程中,你的钩子就可以起作用了:

MSG msg;

while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

这是为什么呢?事实上这和Windows的消息驱动机制有关。Windows中几乎所有的线程、进程间通信都是使用“消息”来实现的。使用消息通知而不是直接调用你提供的函数代码,可以起到线程的隔离和保护作用,防止线程执行不安全的代码。

但这样一来,如果你不接收消息,你就不会得到任何消息。Windows事实上是把消息放到线程的消息队列中,然后线程自己使用GetMessage函数取出来,再使用DispatchMessage分发到各个响应函数中执行。如果你设置了钩子(HOOK)那么GetMessage会先调用那些钩子函数。当然不只是GetMessage, PeekMessage也可以。如果你没调用这两个函数,不只是钩不到消息,说不定你的线程连个消息队列都还没建立呢!

这也解释了鼠标反应迟顿问题。系统把消息给你的线程之后,就等你的线程中的响应结果。可是你没理会它,那它只好在每个消息后都等一会儿。这样就反应迟顿了。

那后来为什么又好了呢?估计是你的消息队列占满了,系统一看这小子太懒了,索性就不把消息给你了,也就不用等了。这样鼠标就又正常了。

更多内容可以看我的上一篇文章:谁在调用那些回调函数

为了让更多人能搜到答案,我多写几个关键字:钩子,线程,子线程,HOOK,SetWindowsHook, SetWindowsHookEx,钩不到,不起作用,没作用,没用。

作者:苏林

子线程设置的钩子(HOOK)为什么钩不到消息?相关推荐

  1. Android子线程更新UI的方法总结

    消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.有些特殊的场景,比如我们都知道,在Android开发中,子线程不能更新UI,而主线程又不 ...

  2. python 子线程 和 子进程 正常结束与强制结束

    目录 子线程结束 ----给子线程设置标志位 ----设置子线程为守护线程 ----强制终止 子进程强制结束 ----设置标志位 ----强制结束 子线程结束 想要的目的是, 主线程能够让子线程结束 ...

  3. Handler消息机制(四):子线程可以创建Handler吗

    默认情况下,ActivityThread类为我们创建的了主线程的Looper和消息队列,所以当你创建Handler之后发送消息的时候,消息的轮训和handle都是在ui线程进行的.这种情况属于子线程给 ...

  4. java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

    之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: ...

  5. Android 子线程更新主线程UI视图

    消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.在Android开发中,子线程不能更新主线程UI,而主线程又不能进行耗时操作(例:网络请 ...

  6. 关于钩子(Hook)的使用

    基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理 ...

  7. mysql 钩子函数_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)...

    基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理 ...

  8. java hook全局钩子_钩子(hook)

    钩子(hook)编程 一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows应用程序传递消息的过程: 如在 ...

  9. Windows 全局钩子 Hook 详解

    监控程序的实现       我们发现一些木马或其他病毒程序常常会将我们的键盘或鼠标的操作消息记录下来然后再将它发到他们指定的地方以实现监听.这种功能其他是利用了全局钩子将鼠标或键盘消息进行了截取,从而 ...

最新文章

  1. 【高并发】为何高并发系统中都要使用消息队列?这次彻底懂了!
  2. 腾讯的电商,在东南亚击败了阿里巴巴
  3. [Eclipse]GEF入门系列(七、XYLayout和展开/折叠功能)
  4. idea springboot配置外置tomcat好处
  5. autoencoder
  6. 查看是否由两个单词组成
  7. mapreduce的shuffle机制(来自学习笔记)
  8. Artech的MVC4框架学习——第三章controller的激活
  9. URL 授权访问另外一种方法,利用 Java 1.1 访问密码保护的 URL
  10. cuda编程_CUDA编程入门(四)并行归约算法
  11. 在PEA上海做演讲主题:大型、高负载网站架构和应用初探
  12. Java学习总结之第十一章 Java集合
  13. YAML_02 playbook的ping脚本检测
  14. 电脑不香吗?我在手机上装Python我图什么?
  15. 【U8】UFO另存为Excel,文件保存失败
  16. 218个数据采集模板免费下载(最新)
  17. html转换为jpg格式,JPG转换成HTML的两种方法
  18. 社交网络分析工具NetworkX和Gephi
  19. swifty项目中pod的使用
  20. 为何公司招聘了IT人才,还要找专业的网络公司建设网站?

热门文章

  1. 高斯模糊(高斯滤波)的原理与算法
  2. 自研代码率超70%,国产大数据基础软件第一股星环科技成功上市!
  3. 使用sourceTree添加git远端
  4. 如何从窗口句柄得到窗口的指针
  5. 使用Linux训练LoRA模型
  6. rhel7 pcs pacemaker corosync配置主从高可用
  7. jquery 将下拉框重置_select下拉框之默认选项清空
  8. Python字串(string)基础与20种常见操作
  9. 如何进行性能测试的调优
  10. android手机可以分屏么,安卓手机怎么分屏操作 安卓手机分屏操作设置教程