【问题标题】:C++ Event HooksC++ 事件挂钩
【发布时间】:2011-05-16 13:41:32
【问题描述】:

我正在尝试理解 C++ 中的事件挂钩。我知道事件是什么,我在 Java、C# 和 Javascript 中经常使用它们。

我遇到的麻烦是查找有关全局挂钩、dll 注入、没有 DLL 的全局挂钩等内容的文档和教程。

假设我想遍历 FireFox 中的浏览器 tabis .. 我是否需要希望 FireFox 有一个用于 C++ 的 API?或者假设我想在用户打开新标签页时做某事,我是否需要使用 FireFox 在其 API 中提供的挂钩?

以上只是一个示例,因此人们知道我想要学习/理解什么。我的想法是否正确?

我在一个论坛上看到了一个帖子,在过去的 2 个小时里我很感兴趣。我总是说,一个棘手的挑战,或者一个新的挑战,会让程序员变得更强大。

非常感谢任何资源或任何帮助。

【问题讨论】:

  • C++ 本身没有“事件”或“事件挂钩”之类的东西。不过,它可能是某些框架的一部分。 “DLL 注入”暗示您可能指的是某些 WinAPI 功能。
  • Firefox(或任何其他应用程序)是否提供某种特定语言的 API,完全由他们的开发团队决定。他们可以选择以任何语言(或多种语言,或根本不提供)提供 API。
  • 第二段让我觉得你在谈论 Windows。如果是这样,请澄清您的问题。 Windows 有一个钩子机制,甚至可以描述为“没有 DLL 的全局钩子”。但是,它与 C++ 无关(它是一个系统 API,与语言无关)。
  • @Vlad 经典示例是一个按键记录器,它使用 WinAPI 提供的 DLL 和挂钩。我看到的所有教程都未能提供有关其他 WinAPI 挂钩的信息,也未能解释 DLL 注入。
  • @atzz 所以 C++ 没有事件或钩子,但 Windows 和其他应用程序(如果 api 可用)有吗?是的,我说的是 Windows。对不起,我没有提到,但只有当你和弗拉德提到它时它才被曝光。我正在慢慢地涵盖更多关于这个主题的内容。

标签: c++ windows


【解决方案1】:

C++ 本身没有事件或钩子,但是很多 C++ 库和框架都实现了它们。有关通用事件库的示例,请参阅Boost.Signals

一些实现允许其他应用程序看到它们的事件,但 API 是特定于应用程序的(例如,对于 Firefox,请参阅 XPCOM)。


Windows 有一个钩子机制,允许监视其窗口系统中的各种事件。然而,它是一个操作系统特性,与 C++ 无关。由于它是一种系统机制,因此所有 Windows 应用程序都会受到影响,即使它们没有为此做任何事情。 Windows 挂钩的文档可以在here 找到。此外,由于您提到“没有 DLL 的全局挂钩”,请参阅SetWinEventHook,它是比上面链接的 Windows 挂钩更高级别的 API,可以与在 DLL 或 EXE 中实现的挂钩函数一起使用。

【讨论】:

  • 谢谢!非常感谢 atzz。
【解决方案2】:

在 MSDN 中查找 SetWindowsHookEx。它应该是您在 Windows 挂钩中的入口。如果您要为 mthe 系统指定一个 parituclar 窗口,那么侵入性较小的选项是 SetWindowLongPtr。对于第一个 API,您将需要一些 Dll 注入 - 系统会自动为您获取。只需按照以下步骤操作:

创建一个导出 HOOKPROC 函数的 Dll(实际类型取决于钩子 tpe - 阅读文档)

在您的应用程序中加载该 Dll 并检索指向 HOOKPROC 函数的指针。 LoadLibrary / GetProcAddress APIs 可用于此。

在您的应用程序中,调用 SetWindowsHookEx 并输入适当的参数 - 这会将 dll 注入目标进程。因此,该 dll 现在已加载到您的应用程序进程和目标进程中。因此,您可能需要一种机制来在两个进程之间进行 IPC。这里有很多方法 - 套接字、管道、DLL 中的共享段、文件系统、Windows 消息、COM 服务器 + 事件等。

以前的 API 虽然功能较弱,但不需要 DLL 注入。

明智地选择,祝你好运!

【讨论】:

  • 是的,就是这样。确实是性格塑造的东西。
【解决方案3】:

我认为 firefox 不会有 C++ API 来查找打开的选项卡.... 如果您想找出打开的选项卡或每当打开新选项卡时,您基本上可以挂钩 firefox 窗口并将该窗口上发生的所有事件都添加到您的挂钩过程中。

如果您在 VC++ 中打开 spy++ 并跟踪 firefox 窗口,您可以看到每次打开新选项卡时都会创建一个新的 MozillaContentWindowClass。因此,您基本上可以遍历窗口句柄并获取有关打开的选项卡的信息。

您可以使用 SetWindowLongPtr 设置该窗口的子类过程。

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2013-04-01
    • 2015-06-05
    • 2011-05-08
    • 2016-02-27
    • 2013-11-01
    相关资源
    最近更新 更多