我正在尝试理解C ++中的事件挂钩。我知道什么是事件,我在Java,C#和Javascript中经常使用它们。
我遇到的问题是找到文档,以及有关全局挂钩,dll注入,没有DLL的全局挂钩等内容的教程。
让我们说我想在FireFox中浏览浏览器tabis ..我是否需要希望FireFox有一个C ++ API?或者假设我想在用户打开新标签时做某事我是否需要使用FireFox在其API中提供的钩子?
上面只是一个例子,所以人们知道我正在努力学习/理解什么。我在考虑正确的ines吗?
我在一个论坛上看到了一个帖子,在过去的两个小时里我对此感兴趣。我总是说,一个棘手的挑战,或一个新的挑战,使一个更强大的程序员。
非常感谢任何资源或任何帮助。
答案 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设置该窗口的子类过程。