我想安装一个钩子(在Windows上使用WinAPI和C ++)来获取发送到特定进程/线程的WindowProc的密钥输入事件(我的程序通过进程ID知道)。据我所知,我必须将钩子程序放入DLL中。到目前为止一切都很好。但钩子程序需要使用安装钩子的程序中的数据。现在我不知道如何从DLL中的钩子程序访问这些数据。
我的第一个想法是在DLL本身内部维护一个数据结构,并通过调用放在DLL中的另一个函数从外部更新它。但我不确定,究竟是怎么做的(例如:我假设这个数据结构必须是共享数据,所以对于所有调用都是一样的,无论从哪个进程/线程,但我不确定它)。
我已经看了几个关于如何实现钩子的例子,但是这些例子从未使用过安装钩子的原始程序(或任何其他“用户代码”)的数据。
当有人向我解释这个问题或者甚至给我一个关于如何解决上述问题的简要概述(以及我的方法是否正确)时,我真的很感激。
非常感谢提前!
答案 0 :(得分:2)
您可以使用共享数据部分
// dll.cpp
#pragma data_seg("myshared")
int iShared;
#pragma data_seg()
#pragma comment(linker, "/section:myshared,RWS")
从DLL导出函数,允许传递要用于该部分中的变量的值。从挂钩EXE中调用该函数(挂钩前)。钩子化进程中的实例DLL将看到挂钩EXE设置的值。
答案 1 :(得分:1)
您真正描述的是进程间通信(IPC):http://en.wikipedia.org/wiki/Inter-process_communication
您对Windows的选择是创建套接字,管道或共享内存,并使用互斥锁,信号量或事件进行同步。
除此之外,没有办法调用注入另一个进程的DLL中的函数。
您可以查看我在此处发布的示例:Two separate processes sharing the same Camera feed OpenCv