【问题标题】:WinAPI: Non-dll data in hook functionWinAPI:挂钩函数中的非 dll 数据
【发布时间】:2014-01-23 00:37:58
【问题描述】:

我想安装一个钩子(在 Windows 上使用 WinAPI 和 C++)来获取发送到特定进程/线程的 WindowProc 的键输入事件(我的程序通过进程 ID 知道)。据我了解,我必须将钩子程序放入 DLL 中。到目前为止,对我来说一切都很好。但是钩子程序需要使用来自安装钩子的程序的数据。现在我不知道如何从 DLL 中的钩子程序访问这些数据。

我的第一个想法是在 DLL 本身内部维护一个数据结构,并通过调用放置在 DLL 中的另一个函数从外部对其进行更新。但我不确定,究竟该怎么做(例如:我假设这个数据结构必须是共享数据,以便所有调用都相同,无论来自哪个进程/线程,但我不确定它)。

我查看了一些关于如何实现挂钩的示例,但这些示例从未使用来自安装挂钩的原始程序(或任何其他“用户代码”)的数据。

如果有人可以向我解释这一点,甚至简要介绍如何解决上述问题(以及我的方法是否正确),我将不胜感激。

非常感谢!

【问题讨论】:

  • 仔细看看 WH_KEYBOARD_LL 钩子,它不需要 DLL。
  • 谢谢!这对我来说看起来不错。我要试试这个。

标签: c++ winapi dll hook


【解决方案1】:

您可以使用共享数据部分

 // dll.cpp
 #pragma data_seg("myshared")
 int iShared;
 #pragma data_seg()
 #pragma comment(linker, "/section:myshared,RWS")

从 DLL 中导出一个函数,允许传递用于节中变量的值。从您的挂钩 EXE 中调用该函数(在挂钩之前)。挂钩进程中的实例 DLL 将看到挂钩 EXE 设置的值。

【讨论】:

    【解决方案2】:

    您真正描述的是进程间通信(IPC):http://en.wikipedia.org/wiki/Inter-process_communication

    Windows 的选项是创建套接字、管道或共享内存,并使用互斥锁、信号量或事件进行同步。

    除此之外,没有办法调用注入到另一个进程的 dll 中的函数。

    您可以查看我在此处发布的示例:Two separate processes sharing the same Camera feed OpenCv

    【讨论】:

    • 我不认为进程间通信是我想要的,因为第二个进程根本不通信。事实上,这第二个进程是一个正在运行的程序,甚至不知道我的程序存在。我只想“过滤”第二个进程获得的键输入消息。
    • 您打算如何让第二个进程“过滤”键输入而不将其硬编码到 .dll 中?我不确定你到底想要达到什么目的..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多