全局键盘挂钩不起作用

2023-12-30

我创建了一个全局键盘挂钩。

Hook 在 DLL 中创建。

#pragma comment(linker, "/SECTION:.SHARED,RWS")
#pragma data_seg(".SHARED")
static HHOOK hkb=NULL;
static CMyFile *pLF;
#pragma data_seg()

HINSTANCE hins = NULL;

extern "C"
LRESULT  __declspec(dllexport) __stdcall  CALLBACK KeyBoardHookProc(
    int nCode, 
    WPARAM wParam, 
    LPARAM lParam)
{

if (nCode < 0) {
        return CallNextHookEx(0, nCode, wParam, lParam);
    }

    return CallNextHookEx(hkb, nCode, wParam, lParam);
}

extern "C"
LRESULT __declspec(dllexport) __stdcall CALLBACK Install()
{
    pLF = new CMyFile(L"c:\\1.txt");
    hkb = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardHookProc,hins,0);
    return 0;

}

extern "C"
BOOL __declspec(dllexport) __stdcall CALLBACK UnInstall()
{
    return UnhookWindowsHookEx(hkb);
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{

    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH :
        hins = (HINSTANCE) hModule;
        break;

    case DLL_THREAD_ATTACH :
        break;

    case DLL_THREAD_DETACH :
        break;

    case DLL_PROCESS_DETACH :
        break;
    }
    return TRUE;
}

我创建了一个 EXe 来加载这个 dll 并调用 hook dll 的安装函数。

 HMODULE hMod = LoadLibrary(L"hk.dll");
   if(hMod!=NULL)
   {
       typedef LRESULT (__stdcall CALLBACK *_installhk)() ;
       _installhk installProc;
       installProc = (_installhk) GetProcAddress(hMod,"Install");
       if(installProc!=NULL)
       {
           installProc();
       }
   }

当我启动 exe 时,KeyBoardHookProc 上的调试断点仅被命中一次。

exe 会继续运行,除非我关闭它,但如果我从键盘输入任何其他内容,则钩子过程不会被调用。

这可能是什么原因?

这不是设置全局键盘挂钩的正确方法吗?


你如何测试钩子过程没有被调用?如果您尝试使用断点检查它,则必须注意您的钩子 dll 会在每个进程中加载​​,但您的断点仅放置在当前进程中。

如果您的应用程序中有任何窗口,请在敲击按键或使用日志对其进行调试之前先关注它。

另一种解决方案是挂钩 WH_KEYBOARD_LL,它不需要额外的 DLL。您可以直接从您的进程中挂钩。

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

全局键盘挂钩不起作用 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 哈希有_key?句法

    我有三个哈希值 a key value b key gt value c key gt value 这些结果 a has key key gt false b has key key gt true c has key key gt fal
  • vue.js:如何处理同一元素上的 click 和 dblclick 事件

    我有一个 vue 组件 其中包含单独的 click dblclick 事件 单击 取消 选择行 双击打开编辑表单 ul class data row 这样做 我会在双击时触发 3 个事件 两次单击事件 最后一次双击事件 由于单击事件首先触发
  • 如何将文本从 iOS Notes 应用程序导出到我的应用程序?

    我知道这是可能的 并且是许多大型应用程序所做的事情 但我无法在 UTI 扩展 UIActivityTypes 等中找出我需要特别使用的拼写 我正在尝试将我的应用程序添加到当您点击 iOS 上的 便笺 应用程序中的 导出 按钮时出现的应用程序
  • 为什么 Guid.ToByteArray() 以这种方式对字节进行排序?

    你打电话时ToByteArray 在 NET 中的 GUID 上 与 GUID 的字符串表示形式相比 结果数组中的字节顺序不是您所期望的 例如 对于以下表示为字符串的 GUID 11223344 5566 7788 9900 aabbccd
  • 哪些 .NET Framework 类实现 IDisposable

    似乎这必须在某个地方记录下来 但我没有发现在任何地方 也许我的谷歌魅力正在减弱 您意识到这取决于您的称呼 NET 框架类 您可能想要指定要查找的程序集 有了这些信息 您就可以加载这些程序集并使用反射来列出在给定程序集中实现 IDisposa
  • (加载“file.scm”)在Scheme的新环境中

    麻省理工学院计划 load 程序显然需要一个环境 http web mit edu scheme v9 0 1 doc mit scheme user Loading Files html作为参数 有什么方法可以 克隆 当前环境并将其传递到
  • Applescript 中的非阻塞对话框

    我必须编写一个小脚本来为我们的应用程序部署补丁 补丁 将替换应用程序中的几个文件 我决定使用 Applescript 部署补丁 需要复制的文件比较大 复制需要一定的时间 我想知道是否有任何方法可以获得一个不会阻止脚本执行的对话框 以便我可以
  • 如何组合两个数组而不重复值?

    我有两个数组 array 1 2 3 4 array 4 5 6 7 基于它们 我想生成一个仅包含唯一值的数组 array 1 2 3 4 5 6 7 PHP中有没有合适的函数 您可以使用array merge http php net a
  • 无法使用 CasperJS 提交表单 - 换句话说无法登录

    我正在尝试使用 CasperJS 使用方法登录 Tumblrstart fill and waitForUrl but cannot做这个 在我看来 表格没有提交 因为超时waitForUr每次都过期了 Terminal response
  • .net-core项目恢复的包目标始终是全局包目录

    我们有一个解决方案 其中一些项目是 net core 项目 一些是 普通 net 4 6 1 项目 在解决方案级别 我们有一个 NuGet config 文件 用于设置存储库路径
  • 如何捕获 SocketTimeoutException

    假设我有一个名为 SuperSocket 的套接字变量 有什么方法可以捕获超时异常吗 SuperSocket setSoTimeout 5000 catch SocketTimeoutException e System out print
  • mysql DECLARE WHILE 外部存储过程如何?

    我对 mysql 相当陌生 但有 MS SQL 经验 是否有可能声明变量并使用while陈述 外部存储过程 我只找到了人们这样做的例子 1 procedure created 2 execute proc 3 drop proc 建议我正确
  • 我可以在 Android/IOS Webview 中使用 navigator.mediaDevices.getUserMedia 吗?

    我在 Android IOS 的本机应用程序中使用 web api 时遇到一些问题 在webview中 我渲染了一个html 我想使用相机拍照 我搜索web api并找到了一个方法 那就是 navigator mediaDevices ge
  • C++中加宽和缩小的区别?

    有什么区别widening and 缩小在 C 中 铸造是什么意思 铸造有哪些类型 这是一般的转换 而不是 C 特有的 加宽 转换是从一种类型到另一种类型的转换 其中 目标 类型具有比 源 更大的范围或精度 例如 int 到 long fl
  • 使用 BigQuery 进行日志分析

    我正在尝试使用 BigQuery 进行日志分析 具体来说 我有一个 appengine 应用程序和一个 javascript 客户端 它将向 BigQuery 发送日志数据 在 bigquery 中 我将完整的日志文本存储在一列中 同时还将
  • 自定义S3中的404页面

    我在亚马逊存储桶和实例方面几乎是个新手 我现在要做的是错误 404 的自定义错误页面 现在显示的是默认错误页面 显示非用户友好的 XML 告诉没有找到该文件 有什么好的方法可以做到这一点吗 我发现文档非常不清楚 它说 提供这个自定义错误文档
  • 如何在 DynamoDB 中过滤嵌套数组对象

    我对 AWS DynamoDB 非常初学者 我想使用 SENDTO emailAddress 扫描 DynamoDB 电子邮件受保护 cdn cgi l email protection 作为过滤器表达式 数据库结构如下所示 ID NAME
  • 具有自定义单元格的 UITableView 在 iOS 6 上绘制良好,但在 iOS 7 中完全白色

    我正在 Xcode 5 上构建一个针对 iOS 6 的应用程序 我在使用自定义单元格构建表格视图时遇到问题 有趣的是 它一直工作得很好 直到我今天更新到 Xcode 5 0 2 我不知道发生了什么变化 当我弄乱 iOS 7 SDK 附带的白
  • 如何使用 OpenXML Sdk 替换段落的文本

    我正在使用 Net OpenXml SDK 2 0 解析一些 Openxml word 文档 作为处理的一部分 我需要用其他句子替换某些句子 在迭代这些段落时 我知道何时找到需要替换的内容 但我对如何替换它感到困惑 例如 假设我需要替换句子
  • 全局键盘挂钩不起作用

    我创建了一个全局键盘挂钩 Hook 在 DLL 中创建 pragma comment linker SECTION SHARED RWS pragma data seg SHARED static HHOOK hkb NULL static