全局系统鼠标钩子(Hook)可以拦截到本程序的鼠标消息但不能拦截到全局鼠标消息,鼠标单击事件等等

lianxubao 2014-03-17 09:33:07
我最近使用Hook技术监听鼠标消息,因为要用到系统钩子,使用自己实现了一个DLL,DLL中安装钩子代码如下:
g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hModule, 0);自己实现的钩子回调函数代码如下:
//鼠标钩子处理函数
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
ProcessMouse(nCode, wParam, lParam);
return CallNextHookEx(g_hMouse, nCode, wParam, lParam);;
}
其中ProcessMouse是主程序的一个回调函数,即返回主程序对鼠标消息进行相应的处理,安装钩子时将此回调函数的地址传给DLL,但是发现钩子可以拦截调用程序的各种鼠标消息,但是却不能拦截到系统全局的鼠标消息(例如单击左键,单击右键,滚动滑轮,点击滑轮等等)貌似只能拦截到系统全局的鼠标移动消息。另,经过测试若鼠标钩子处理函数返回1可以屏蔽鼠标消息,小弟实在是不解。
小弟已经被这个问题困扰一周了,求各位大神指导呀,感激不尽,高分悬赏!
...全文
1561 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
crashcrazy 2015-08-13
  • 打赏
  • 举报
回复
受益了 。
副组长 2014-10-28
  • 打赏
  • 举报
回复
引用 5 楼 ProgrammingRing 的回复:
[quote=引用 4 楼 lianxubao 的回复:] [quote=引用 3 楼 ProgrammingRing 的回复:] 全局Hook会将Dll注入到其他进程, 其他进程不能调用你的主进程的回调函数吧? 至于返回非1屏蔽鼠标消息, 是因为返回非0值就不会将消息再传递目标窗口过程了(参见MSDN).
有道理,那我应该用什么方法获取到全局的鼠标消息呢?也就是用什么方法能让我的主程序知道发生了这些鼠标事件呢?按理说我传递了主程序的回调函数地址应该能够调用啊,而且我在DLL中回调函数的地址设为了共享,对所有应用程序是一样的。[/quote] 地址设为了共享, 代码总在你主程序中吧? 其他程序可以访问主程序的内存空间? 传送的话可以发送WM_COPYDATA或者CreateFileMapping创建一个命名的内存映射.[/quote] 也可以不使用共享内存,从dll向主程序直接发消息也可以,如果你主程序有窗口。 在主程序启动dll前 g_hModule = LoadLibrary("dllhook.dll") 然后StartHool再把g_hModule 传回去。 在dll里面建一个窗口指针把主程序的窗口传进去。 dll hook到鼠标消息后,将鼠标信息合成一个消息串发送到主窗口就可以。
gomez44944 2014-03-21
  • 打赏
  • 举报
回复
用这种方法能够实现dll监控exe某个消息吗?
Eleven 2014-03-17
  • 打赏
  • 举报
回复
引用 8 楼 lianxubao 的回复:
[quote=引用 6 楼 VisualEleven 的回复:] 试试SetWindowsHookEx(WH_MOUSE_LL, ...);
你说的这种鼠标钩子中不需要把钩子处理函数写到DLL中的吧,你的意思是把钩子处理函数写到主程序中?现在的问题是能捕获到消息,但是是不能在主程序里捕获到。[/quote] 是的,不需要写到dll中。
ProgrammingRing 2014-03-17
  • 打赏
  • 举报
回复
引用 7 楼 lianxubao 的回复:
[quote=引用 5 楼 ProgrammingRing 的回复:] 一语中的啊,谢谢啊,原来这才是问题的所在,你说的这两种方法具体应如何实现呢?顺便问下哈,您用过钩子吗?有很多问题想要请教啊~
1> WM_COPYDATA COPYDATASTRUCT CopyData = {0, DataSize, Data}; // DataSize和Data分别为要传送的数据和长度 SendMessage(主程序窗口句柄, WM_COPYDATA, NULL, ©Data); 2> CreateFileMapping HANDLE MapHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 内存大小高32, 低32, TEXT("MemMap")); LPVOID MapMemory = MapViewOfFile(MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); Dll中可以将信息写入MapMem 主程序中可以通过 HANDLE MapHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 内存大小高32, 低32, TEXT("MemMap")); 或 HANDLE MapHandle = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, TEXT("MemMap")); LPVOID MapMemory = MapViewOfFile(MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); 来打开创建的内存映射, 从MapMemory中获取Dll中写入的数据. 你也可以设置个标记什么的来通知Dll写了数据, 主程序可以读了,如信号. 你也可以如上面那位所说, 用WH_MOUSE_LL看看, 印象里貌似低级钩子可以不用安装到DLL中, 直接在主程序中挂钩, 处理函数可以直接放到主程序中
lianxubao 2014-03-17
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
试试SetWindowsHookEx(WH_MOUSE_LL, ...);
你说的这种鼠标钩子中不需要把钩子处理函数写到DLL中的吧,你的意思是把钩子处理函数写到主程序中?现在的问题是能捕获到消息,但是是不能在主程序里捕获到。
lianxubao 2014-03-17
  • 打赏
  • 举报
回复
[quote=引用 5 楼 ProgrammingRing 的回复:] 一语中的啊,谢谢啊,原来这才是问题的所在,你说的这两种方法具体应如何实现呢?顺便问下哈,您用过钩子吗?有很多问题想要请教啊~
Eleven 2014-03-17
  • 打赏
  • 举报
回复
试试SetWindowsHookEx(WH_MOUSE_LL, ...);
ProgrammingRing 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 lianxubao 的回复:
[quote=引用 3 楼 ProgrammingRing 的回复:] 全局Hook会将Dll注入到其他进程, 其他进程不能调用你的主进程的回调函数吧? 至于返回非1屏蔽鼠标消息, 是因为返回非0值就不会将消息再传递目标窗口过程了(参见MSDN).
有道理,那我应该用什么方法获取到全局的鼠标消息呢?也就是用什么方法能让我的主程序知道发生了这些鼠标事件呢?按理说我传递了主程序的回调函数地址应该能够调用啊,而且我在DLL中回调函数的地址设为了共享,对所有应用程序是一样的。[/quote] 地址设为了共享, 代码总在你主程序中吧? 其他程序可以访问主程序的内存空间? 传送的话可以发送WM_COPYDATA或者CreateFileMapping创建一个命名的内存映射.
lianxubao 2014-03-17
  • 打赏
  • 举报
回复
引用 3 楼 ProgrammingRing 的回复:
全局Hook会将Dll注入到其他进程, 其他进程不能调用你的主进程的回调函数吧? 至于返回非1屏蔽鼠标消息, 是因为返回非0值就不会将消息再传递目标窗口过程了(参见MSDN).
有道理,那我应该用什么方法获取到全局的鼠标消息呢?也就是用什么方法能让我的主程序知道发生了这些鼠标事件呢?按理说我传递了主程序的回调函数地址应该能够调用啊,而且我在DLL中回调函数的地址设为了共享,对所有应用程序是一样的。
ProgrammingRing 2014-03-17
  • 打赏
  • 举报
回复
全局Hook会将Dll注入到其他进程, 其他进程不能调用你的主进程的回调函数吧? 至于返回非1屏蔽鼠标消息, 是因为返回非0值就不会将消息再传递目标窗口过程了(参见MSDN).
lianxubao 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 xuddk727 的回复:
你g_hModule是怎么获得的
从DLLMain中传递的参数获取的hModule获取的
许文君 2014-03-17
  • 打赏
  • 举报
回复
你g_hModule是怎么获得的

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧