低级鼠标和键盘钩子回调在哪个线程中运行?

2024-01-01

我正在设置一个低级鼠标钩与SetWindowsHookEx:

HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL, 
                                 &callback, 
                                 GetModuleHandle(NULL), 
                                 NULL);

因为这是一个低级回调,所以它将在我自己的进程内执行;不执行 DLL 注入。

现在,我注意到回调有时(间接)从标准 API 函数调用,例如GetAncestor, GetWindowRect等等。看来这些可能会导致某些消息队列被刷新。

事实上,我的问题有三个……

  1. 什么时候调用回调?

    可以从内部调用吗anyAPI函数?我怎么知道?

  2. 回调在哪个线程上执行?

    它只会在安装钩子的线程上运行,还是系统可以在任何线程上调用它?

  3. 为什么首先将钩子实现为回调?

    (Raymond Chen 在这里闲逛吗?)对我来说,将钩子简单地实现为(发送的)消息似乎更明智,就像几乎所有 Windows 的其余部分一样。对于消息,至少我知道哪些函数可以导致待发送的消息被处理(GetMessage, PeekMessage和其他一些),我会知道它们在哪个线程上处理(首先接收消息的线程)。


  1. See 3.

  2. 里面写得很清楚文档 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644986%28v=vs.85%29:

[...] 但是,WH_MOUSE_LL 挂钩不会注入到另一个进程中。相反,上下文切换回安装钩子的进程,并在其原始上下文中调用它。然后上下文切换回生成事件的应用程序。 [...]该钩子在安装它的线程的上下文中被调用。

  1. 其实它is像这样实现:

[...] 该调用是通过向安装挂钩的线程发送消息来进行的。因此,安装钩子的线程必须有消息循环。

AFAIK, when your hook must be called Windows puts a special message in your thread's message queue. Your code in the message pump calls Peek/GetMessage, which checks if it's the special message and, if it is, it calls your hook procedure (some evidence here https://cboard.cprogramming.com/windows-programming/119909-setwindowshookex-lowlevelmouseproc.html, whence I took the image). Hook dispatching call stack
(source: cprogramming.com http://cboard.cprogramming.com/attachments/windows-programming/9323d1253895425-setwindowshookex-lowlevelmouseproc-hook-callback-callstack-png)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

低级鼠标和键盘钩子回调在哪个线程中运行? 的相关文章

  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • 线程自身连接

    我很怀疑 当线程加入自身时会发生什么 即线程自行调用 join 方法 我没有收到任何错误 样本 public class JoinItself extends Thread public void run System out printl
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 在 Three.js 中从 Web Worker 加载纹理

    当将大纹理图像应用到网格上一段明显的时间时 Three js 会锁定浏览器的主线程 让我们考虑以下示例 var texLoader new THREE TextureLoader texLoader load someLargeTextur
  • 理解 JavaScript 的单线程本质

    我一直在阅读 John Resig 的 JavaScript Ninja 的秘密 它解释了 JavaScript 是单线程的 但是 我尝试对此进行测试 但我不确定要从这里删除什么 executing this in browser func
  • std::condition_variable::wait_for 和 std::condition_variable::wait_until 有什么区别?

    The 我正在使用的参考 http en cppreference com w cpp thread condition variable对两者的解释如下 wait for 阻塞当前线程 直到条件变量被唤醒或在指定的超时持续时间之后 wai
  • 如何限制Erlang VM(BEAM)使用的核心数量?

    我正在具有 2 个四核 Xeon E5520 2 2GHz 24 0GB RAM 和 Erlang R15B02 启用 SMP 的节点上运行实验 我想知道是否可以限制Erlang VM使用的核心数量 以便我可以暂时禁用一些核心并逐步增加数量
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 检测桌面是否被锁定[重复]

    这个问题在这里已经有答案了 可能的重复 如何以编程方式确定我的工作站是否被锁定 https stackoverflow com questions 44980 how can i programmatically determine if
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • java中使用多线程调用同一类的不同方法

    我有一个类 如下所示 具有三种方法 public class MyRunnable implements Runnable Override public void run what code need to write here to c
  • 以编程方式更改任务栏图标(Win32,C++)[重复]

    这个问题在这里已经有答案了 我有一个 C win32 程序 我想在运行时编辑任务栏图标以显示有关该程序的警报等 但是我对 win32 api 不太有经验 而且我找不到任何东西在线的 我发现的最接近的是http www windows tec
  • 如何在Spring-Boot中创建DefaultMessageListenerContainer?

    我是 Spring Boot 的新手 并尝试创建 DefaultMessageListenerContainer 以便我可以使用 weblogic workmanager 并以多线程方式运行多个消息侦听器 有人可以提供一些例子吗 到目前为止
  • 是否可以通过 C#.NET 编写 Win32 .dll 文件?

    是否可以通过 C NET 编写 Win32 dll 文件 如果是的话 我在哪里可以找到一些教程 如果不是 那么您对编写 Win32 DLL 有什么建议 Thanks 对的 这是可能的 事实上有一个工具可以做到这一点 它在 Rainmeter
  • 异步回调在哪个线程上运行?

    我正在做几个HttpWebRequest BeginGetResponse调用 并在回调方法中BeginGetResponse 我正在调用一个事件处理程序 在EventHandler中 有测试下载是否成功的逻辑 如果没有 它会尝试重新下载
  • 奇怪的跨线程 UI 错误

    我正在编写一个 WinForms 应用程序 它有两种模式 控制台或 GUI 同一解决方案中的三个项目 一个用于控制台应用程序 一个用于 UI 表单 第三个用于保存两个界面也将连接的逻辑 控制台应用程序运行绝对流畅 保存用户选择的模型 它有一
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程

随机推荐

  • Delphi Tokyo 64 位将非正规数刷新为零?

    在短暂查看 system math 的源代码时 我发现 64 位版本 Delphi Tokyo 10 2 3 将非正规 IEEE Doubles 刷新为零 从以下程序中可以看出 apptype console uses system sys
  • 所有可能接触项目后端的开发人员都应该了解哪些有用的 SQL 语句/使用模式?

    所有可能接触项目后端的开发人员都应该了解哪些有用的 SQL 语句 Update 就像在算法中一样 我们知道存在排序问题 洗牌问题 并且我们知道它们的一些解决方案 这个问题是针对同一件事 例如 我能想到的一个是 获取不存在的类的列表 由任何学
  • x86 是否具有原子增量来保留存储的值?

    我已经发现lock inc addr但这并没有保留存储值的副本 甚至同一线程中紧随其后的读取也可能发生在竞争写入之后 我发现的最好的解决方案是load inc cas http en wikipedia org wiki Compare a
  • 使用 ZeroMQ 实现消息总线

    我必须开发一个消息总线 供进程相互发送和接收消息 目前 我们正在Linux上运行 并计划稍后移植到其他平台 为此 我使用 TCP 上的 ZeroMQ 该模式是带有转发器的 PUB SUB 我的总线作为一个单独的进程运行 所有客户端都连接到
  • 如何使用JBoss Tattletale工具?

    我需要减小项目中 JAR 文件的大小 即 9 17MB 我已经减小了它 通过删除所有记录器语句和死代码 将文件大小减少到 6 31MB 我还通过删除并编译每个 JAR 文件来单独检查它 通过它 我删除了最多 6 个文件 现在我想将 JAR
  • 在 Chrome 操作系统上加载本地文件

    我正在尝试创建一个 JavaScript pacman 游戏 但每当我尝试加载脚本文件或图像时 都会收到错误 The browser I m using is chrome and the files are stored in the s
  • 在 Jquery Ui Datepicker 中禁用今天之后的未来日期

    我想在 Jquery Ui Datepicker 中禁用今天之后的所有未来日期 这里是Demo http jsfiddle net X82aC 541 Code start date datepicker maxDate 0 beforeS
  • 如何从 JAX-WS Web 服务中访问 ApplicationContext?

    如同如何从 JAX WS Web 服务中访问 ServletContext https stackoverflow com questions 261348 how can i access the servletcontext from
  • AsyncTaskLoader 基本示例。 (安卓)

    我在我的应用程序中使用 Loader 并根据使用此 Loader 对 COntacts 执行的查询得到的结果 我执行一些计算并将它们存储回 Sqlite DB 中 我希望这个操作是异步的 但是我对使用异步任务感到困惑 因为我有很多不同的数据
  • 带有分隔符作为字符串的字符串列表?

    我在一个存储为字符串的对象中有一个名为 HistoryText 的属性 我想显示网格中的所有行 我应该能够删除和编辑网格中的行 格式为 16 5 2003 12 09 anna Organization created 2 6 2005 1
  • JSF 2.0 使用外部上下文以及 faces-redirect=true 打开新的浏览器窗口

    我正在开发 JSF 2 0 应用程序 单击 时 我在后端 bean 操作中执行一些逻辑 需要重定向到新窗口中的另一个 URL 并在退出操作之前在原始 bean 操作中执行一些清理工作 我目前正在使用 externalContext redi
  • 有多少用户可以打开与 Microsoft Access 的连接?

    有多少用户可以同时打开与 Microsoft Access 数据库的连接 我正在使用 asp net 4 0 来编写我的应用程序
  • nodeschool learnyounode node.js 模块 FILTER LS 练习

    下面是nodeschool learnyounode模块的练习5 创建一个程序 打印给定目录中的文件列表 并按文件扩展名进行过滤 您将获得一个目录名称作为程序的第一个参数 例如 path to dir 和作为第二个参数进行过滤的文件扩展名
  • JavaDoc:在哪里向文档添加注释/评论?

    当用 C 编码时 我总是找到标签remarks对于提供有关类或方法的实现的注释 或者提供有关我正在实现的理论的信息非常有用 我现在使用 Java 但找不到合适的 JavaDoc 标签 也许在 Java 中你可以用不同的方式来完成这个任务 有
  • 如何获得aprun排名

    我正在尝试使用 aprun 运行多节点作业 但是 我不知道如何在 bash 环境中获取排名 或作为每个作业的 ID 的任何内容 就像这个简单的工作 aprun n 8 N 2 examplebashscript sh 我怎样才能获得每个衍生
  • 在 Xcode 中,如何使用您拥有源代码的外部库进行调试?

    我在 Xcode 中为 OS X 构建了一个大型 C C Objective C 项目 该项目链接到预构建的 Qt5 库 这一切都运行得很好 直到出现崩溃并且我得到了包含 Qt 函数的堆栈跟踪 如果我单击 Qt 函数之一的堆栈框架 Xcod
  • 在 R 中安装 tar.gz 包时出错

    当我尝试安装 R 包时nlopt 2 4 2 tar gz from http ab initio mit edu nlopt nlopt 2 4 2 tar gz http ab initio mit edu nlopt nlopt 2
  • 如何使 Mercurial 按提交日期对 `hg log -G` 的输出进行排序?

    我怎样才能使 Mercurial 对图形日志输出进行排序hg log G按提交日期 Using hg log r sort all date 无需图形日志选项即可工作 如 1 https stackoverflow com question
  • JavaScript 复选框总和

    我有一个任务 我应该创建一个 订单 页面 其中包含复选框格式的表单和项目 我用 javascript 编写了一个函数 将标记的复选框的值添加在一起并返回总计 昨天工作正常 但我昨天可能做了一些事情而没有注意到 并且它不再添加值了 这是函数
  • 低级鼠标和键盘钩子回调在哪个线程中运行?

    我正在设置一个低级鼠标钩与SetWindowsHookEx HANDLE handle SetWindowsHookEx WH MOUSE LL callback GetModuleHandle NULL NULL 因为这是一个低级回调 所