dll中的全局鼠标钩子如何通知自己的exe

lake_cx 2008-03-07 09:15:51
写了个HookDll,创建了FileMapping,把exe中的主窗体的Handle写了进去
在HookProc中,我用SendMessage发消息给exe的主窗体时,似乎没什么问题,就是因为SendMessage会阻塞,exe中消息处理没弄好,或者调试模式打了断点后会阻塞很多其他进程的消息循环,导致系统卡死。。。
但是用PostMessage时,数据的同步问题不好解决(我还使用了FileMapping写了部分数据给exe读取),而且在鼠标钩子中,移动exe的主窗体会导致界面卡死(根据调试发现是由于HookDll PostMessage过多所致,似乎有死循环),当鼠标移出exe主窗体后恢复正常,哪位高手帮我分析下上面主窗体界面卡死的原因,并说下你们使用全局钩子时如何与exe进行通信的。
...全文
96 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-03-07
  • 打赏
  • 举报
回复
LZ要在进程间传递什么样的数据,每次传递大小是多少?
另外,如果你的HookProc中没有采取各种同步手段的话,应该不会阻塞其它线程的(除非系统在调HookProc前采取了同步手段)。
rageliu 2008-03-07
  • 打赏
  • 举报
回复
安装hook的时候可以传递句柄参数

数据可以使用共享数据段
lake_cx 2008-03-07
  • 打赏
  • 举报
回复
嗯,为什么勾了自己的窗体会麻烦?我只勾了鼠标消息,并不是所有消息。
zhoujianhei 2008-03-07
  • 打赏
  • 举报
回复
你是不是把自己的窗体也钩啦,那样会很麻烦的。
lake_cx 2008-03-07
  • 打赏
  • 举报
回复
想做的是个模块,用WM_COPYDATA比较影响使用,用SendMessage老把系统搞挂。。。都没法调试。。。
其实鼠标钩子的话用PostMessage其实没问题,对缓冲区的数据没什么实时性要求,就是写位置信息而已,是最新的就可以了,但是能不能帮我分析下移动主窗体时,为什么主窗体会一直接收到Hook的消息(即时停止所有操作)
jameshooo 2008-03-07
  • 打赏
  • 举报
回复
数据都往FileMapping中写,PostMessage给exe主窗口通知它读取数据。
关键要看你要传递什么类型的数据:
1、如果数据很简单,比如一至两个整数,直接用PostMessage就能解决;
2、如果有不太大的数据块(不超过512字节),可以用WM_COPYDATA消息;
3、如果有大的数据块,把数据块存入共享内存,在需要自动同步的情况下,使用SendMessage通知主窗口读取数据,如果自己控制缓冲区同步,则可以用PostMessage。还是建议使用SendMessage,唯一的要求是主窗口处理消息不要太耗时
lake_cx 2008-03-07
  • 打赏
  • 举报
回复
我想用非阻塞的,保证系统的安全,但又要数据是有效的(数据与事件能同步),最好是消息驱动模式,不想开个线程去检测其他内核对象,因为与UI同步仍旧转到消息驱动上面来了。。。
zhoujianhei 2008-03-07
  • 打赏
  • 举报
回复
通信方式有好多种,不知道你喜欢哪一种。
  • 打赏
  • 举报
回复
没做过这样的东西,
不过我觉得比较好的解决方案是使用进程间通讯,CreateEvent 什么的。
lake_cx 2008-03-07
  • 打赏
  • 举报
回复
唉,用了SendMessage,虽说自己的程序中处理窗体消息正确且无耗时操作就行,但是总觉得不安全。。。
不过现在倒是没什么问题,做一个取屏幕颜色的小程序而已,完成了倒是没什么问题,只是觉得是不是有更好的方式

15,471

社区成员

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

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