使用 SetWindowsHookEx() 阻止窗口鼠标单击

2024-05-22

我编写了一个应用程序,将某些过程挂接到新进程上,以监视鼠标按下事件并禁用新进程上的鼠标按下事件。截至目前,我能够捕获进入此进程的鼠标按下事件,并且我正在尝试将所有鼠标按下事件作为 POC 禁用。这就是我目前在钩子程序中所做的事情。

extern "C" __declspec(dllexport) LRESULT  __stdcall meconnect(int code, WPARAM wParam, LPARAM lParam) {

    if (code >= 0) {
        LPMSG msg = (LPMSG)lParam;

        if (msg->message == WM_LBUTTONDOWN) {

            OutputDebugString(L"Mouse down event happened \n");

            return false;

        }

    }

    return(CallNextHookEx(NULL, code, wParam, lParam));

}

当我执行鼠标按下事件时,我收到我编写的日志消息。但我也希望点击事件被阻止,因为我返回 false。但它不会发生,并且单击事件会像正常单击一样进行。我怎样才能禁用鼠标按下事件。预先感谢您对此的任何帮助

这就是我调用 setWindowsHookEx 的方式

HHOOK handle = SetWindowsHookEx(WH_GETMESSAGE, addr, dll, threadID);

你应该打电话的原因CallNextHookEx在您的钩子例程中,以便消息可以传递到可能安装的任何其他钩子。如果不这样做并不会阻止接收该消息的应用程序看到该消息。

The 的文档WM_NULL https://slatestarcodex.com/2015/10/31/ot32-when-hell-is-full-the-thread-will-walk-the-earth/#comment-255524解释如何阻止该消息:

例如,如果应用程序安装了 WH_GETMESSAGE 挂钩并希望阻止处理消息,则 GetMsgProc 回调函数可以将消息号更改为 WM_NULL,以便收件人将忽略它。

因此,更正后的代码应如下所示:

extern "C" __declspec(dllexport) LRESULT  __stdcall meconnect(int code, WPARAM wParam, LPARAM lParam) {

    if (code >= 0) {

        LPMSG msg = (LPMSG)lParam;

        if (msg->message == WM_LBUTTONDOWN) {

            OutputDebugString(L"Mouse down event happened \n");

            msg->message = WM_NULL;

            return false;

        }

    }

    return(CallNextHookEx(NULL, code, wParam, lParam));

}

但是,如果存在其他钩子,这可能会导致不一致的行为,因为另一个钩子是否看到WM_LBUTTONDOWN or WM_NULL将取决于钩链的顺序,这是不可预测的。最好尝试这样的事情:

extern "C" __declspec(dllexport) LRESULT  __stdcall meconnect(int code, WPARAM wParam, LPARAM lParam) {

    if (code >= 0) {

        LPMSG msg = (LPMSG)lParam;

        int result = CallNextHookEx(NULL, code, wParam, lParam);

        if (msg->message == WM_LBUTTONDOWN) {

            OutputDebugString(L"Mouse down event happened \n");

            msg->message = WM_NULL;

        }

        return result;

    }

    return(CallNextHookEx(NULL, code, wParam, lParam));

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

使用 SetWindowsHookEx() 阻止窗口鼠标单击 的相关文章

随机推荐

  • Ruby:如何编写 gem? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为 Ruby 编写一个包并将其作为 gem 提供 有哪些工具 步骤和陷阱 有没有好的教程 截屏视频等
  • 迁移现有的 Spring Websocket 处理程序以使用 rsocket

    假设我有一个用于聊天消息的简单 Websocket 处理程序 Override public Mono
  • 为什么处置/关闭 WCF 客户端代理很重要

    我听说即使在以下情况下也必须处置 或关闭 WCF 客户端代理 你没有使用会话 没有需要确定性清理的非托管资源 例如打开的套接字 例如 当使用具有默认绑定配置的 BasicHttpBinding 时 即使在流行的网页中也应该没问题 对吧 va
  • Gulp 不会看到任何变化

    我正在绞尽脑汁 但似乎无法弄清楚下面的 gulpfile 有什么问题 它只是监视和编译 less 文件 这根本不会少看变化 我已经尝试了所有gulp gulp watch 每次更改后我都必须手动运行 gulp 来编译它们 是否有什么问题导致
  • 重载 std::bitset 的移位运算符

    我想使用移位运算符进行位旋转instead他们的实际位移 这是我的预期行为 std bitset lt 8 gt b8 1010 b8 00001010 b8 lt lt 5 b8 01000001 所以我尝试超载 lt lt 运算符 引用
  • Robot Framework - 访客界面 - 如何获取关键字的子关键字?

    实施机器人后套件访客界面 https robot framework readthedocs io en 3 0 autodoc robot model html robot model visitor SuiteVisitor功能def
  • 非图形三向合并工具

    我目前使用 RCS 的合并命令进行 3 路合并 但有一件事一直让我烦恼 如果我使用 A选项 两个文件中所做的相同更改显示为冲突 lt lt lt lt lt lt lt file1 file1 line 1 orig orig line 1
  • 服务、控制器、提供者命名约定

    随着我职业生涯的成长 我认为命名约定非常重要 我注意到人们乱扔控制器 LibraryController 服务 LibraryService 和提供者 LibraryProvider并在某种程度上可以互换使用它们 使用其中一种与另一种有什么
  • SpringMVC - Hibernate:java.base/[Ljava.lang.Object;无法投射到

    组 java package com keating model import com fasterxml jackson databind annotation JsonSerialize import org hibernate ann
  • 以编程方式生成渐变?

    给定 2 个 RGB 颜色和一个矩形区域 我想在颜色之间生成基本的线性渐变 我进行了快速搜索 我唯一能找到的是这个博客条目 http jtauber com blog 2008 05 18 creating gradients progra
  • Flutter- GestureDetector 检测水平和垂直拖动的方向

    我在用GestureDetector并没有找到任何onXYZ告诉您拖动方向的事件 你试过了吗onPanUpdate details 方法 以下是您可以如何做到这一点 GestureDetector onPanUpdate details i
  • 拒绝对先前失败的类 java.lang.Class supportLib=28 重新初始化

    当我切换到 supportLibrary 28 时 这个奇怪的 logcat 消息开始出现 但在 27 1 1 上却没有出现 我尝试使用一个空的默认项目 结果完全相同 该问题很容易重现 创建一个包含空活动的新项目 并在除 API28 模拟器
  • 如何忽略 perl 中的“证书验证失败”错误?

    我想访问一个无法验证证书的网站 我正在使用 WWW Mechanize 获取请求 那么如何忽略这一点并继续连接到该网站呢 use IO Socket SSL qw use WWW Mechanize qw my mech WWW Mecha
  • Rails 生产“CSS 未预编译”

    我已经在我的 Leopard 网络服务器上使用生产环境在姊妹 Rails 3 1 应用程序上完成了此操作 所以我没想到部署这个应用程序会如此失败 我已经让 Passenger 识别出该应用程序 但我在 apache 中收到 GET miss
  • ASP.NET MVC 开源真实世界应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 每当我开始学习新技术或语言时 我倾向于查看一些 现实世界 应用程序的源代码 我发现它们对于理解常见的
  • .NET 中非常奇怪的 SSL 错误:仅针对特定 URL 无法解密指定数据

    我正在使用 NET 从 URL 下载数据 对于大多数 URL 它都没有问题 但对于一个特定的 URL 当我尝试建立连接时 我收到一个非常奇怪的错误 此外 该错误仅在第二次 及后续 尝试发出请求时发生 第一次似乎总是有效 这是一些演示该问题的
  • 如何在 bash 上运行 MySQL 命令?

    以下代码在命令行上运行 mysql user myusername password mypassword database mydatabase execute DROP DATABASE myusername CREATE DATABA
  • SSLHandshakeException:证书中的主机名不匹配

    我正在编写一个系统 必须向具有自签名证书的服务器 一个名为 ARX 的第三方程序 当前在开发过程中在本地主机上运行 进行多部分发布 我试图找到它的证书 但只能找到三个不同的jks文件 服务器 jks 服务器信任 jks and 服务器ca
  • iOS HealthKit 今天的步数始终为 0(但尾随天数没问题)

    在我们的应用程序中 我们查询 HealthKit 以获取过去 7 天的步数 每天汇总 以午夜为基准 所以范围是 D 6 午夜到明天午夜 因为我们想要今天的步骤到现在为止 它有效 我们总是能够获取过去 6 天的数据 除了今天的数据始终为 0
  • 使用 SetWindowsHookEx() 阻止窗口鼠标单击

    我编写了一个应用程序 将某些过程挂接到新进程上 以监视鼠标按下事件并禁用新进程上的鼠标按下事件 截至目前 我能够捕获进入此进程的鼠标按下事件 并且我正在尝试将所有鼠标按下事件作为 POC 禁用 这就是我目前在钩子程序中所做的事情 exter