C ++事件挂钩

时间:2010-11-27 13:50:04

标签: c++ windows

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

我遇到的问题是找到文档,以及有关全局挂钩,dll注入,没有DLL的全局挂钩等内容的教程。

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

上面只是一个例子,所以人们知道我正在努力学习/理解什么。我在考虑正确的ines吗?

我在一个论坛上看到了一个帖子,在过去的两个小时里我对此感兴趣。我总是说,一个棘手的挑战,或一个新的挑战,使一个更强大的程序员。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

< / p>

答案 1 :(得分:3)

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

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

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

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

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

明智地选择&amp;祝你好运!

答案 2 :(得分:0)

我不认为firefox会有一个C ++ aPI来查找打开的标签.... 如果您想查找打开的选项卡或每当打开一个新选项卡时,您基本上可以挂钩firefox窗口并将该窗口上发生的所有事件发送到您的钩子程序。

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

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