vc postmessage 模拟鼠标点击问题 很奇怪,很无奈,很严重 请大家帮忙看看

菜头叔 2013-12-19 06:55:10
各位大神,我做了个模拟鼠标点击的东东,原理是通过WH_MOUSE_LL钩子抓取系统中的鼠标WM_LBUTTONDOWN 和 WM_LBUTTONUP消息并把这些数据记录下来了。 然后在回放的时候开了个线程不断读取这些记录的消息数据并通过
//发送事件
::PostMessage(GetNowGameHwnd(),m_verMouseEvt[i]->GetMessage(),0,MAKELPARAM(pt.x,pt.y));

m_verMouseEvt是保持消息数据的自定义类。
通过它可以正确把消息发送到相应的窗体上,效果也都OK,但是有个问题,就是每次执行这一句话的时候系统鼠标焦点就会被抢掉。

例如:当这个线程在不停的往某个窗体发送消息的时候,我随便打开一个窗口,并用鼠标拖动它不松开,一旦当线程中执行到postmessage这句话的时候鼠标焦点马上消失,刚才拖动的那个窗口回到原始位置。


求大神指点!!!!!
感激不尽。~

我知道原因可能是:系统的鼠标资源是唯一的,当接收消息的窗口收到鼠标消息并执行的时候当然会抢走鼠标焦点,但是我不明白,也不确定是否是这样。
...全文
498 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜头叔 2013-12-30
  • 打赏
  • 举报
回复
已经给分,如果大神知道原因的话希望能够告知一二 谢谢 我的邮箱 weifengyezi@outlook.com
菜头叔 2013-12-30
  • 打赏
  • 举报
回复
大神,请接受我的膜拜,真是当局者迷啊,我竟然没有想到用sendmessage试一下。 不过还是很奇怪为何会出现这种情况。
schlafenhamster 2013-12-25
  • 打赏
  • 举报
回复
我不关心 B 窗口
schlafenhamster 2013-12-25
  • 打赏
  • 举报
回复
用 Send 就好了: //发送事件 ::SendMessage(GetNowGameHwnd(),m_verMouseEvt[i]->GetMessage(),0,MAKELPARAM(pt.x,pt.y)); afxDump << i << " post\n"; //休眠时间差 Sleep(nSleep);
菜头叔 2013-12-25
  • 打赏
  • 举报
回复
这个demo中
菜头叔 2013-12-25
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
你是: if (wParam==WM_LBUTTONDOWN || wParam==WM_LBUTTONUP || wParam==WM_RBUTTONDOWN || wParam==WM_RBUTTONUP) 这些消息,鼠标点击时会产生,这是真的 mouse。 当你 postmessage是 ,是你 模拟 点击, 与 鼠标 不相关 ! 可能是 ::PostMessage(GetNowGameHwnd(),m_verMouseEvt[i]->GetMessage(),0,MAKELPARAM(pt.x,pt.y)); 太快 。 人眼 也 看不过来!试试: //休眠时间差 Sleep(200);//nSleep);
这个dome中我是指模拟整个操作过程,其实鼠标消息已经正确的发送到对应的窗体上并产生效果了,可能是这个dome中界面上面什么也没有看不出回放的效果。 关键是为何每次::PostMessage(GetNowGameHwnd(),m_verMouseEvt[i]->GetMessage(),0,MAKELPARAM(pt.x,pt.y)); 回放的时候鼠标焦点就会被强调很是费解。一直想不出一个原因。 why?
菜头叔 2013-12-25
  • 打赏
  • 举报
回复
引用 11 楼 zgl7903 的回复:
瞎想一下 在HOOK键盘鼠标,在播放消息时过滤掉硬件键鼠消息 或在有硬件键鼠消息时暂停播放消息
过滤掉硬件消息? 可以详细说明一下吗?
schlafenhamster 2013-12-24
  • 打赏
  • 举报
回复
你是: if (wParam==WM_LBUTTONDOWN || wParam==WM_LBUTTONUP || wParam==WM_RBUTTONDOWN || wParam==WM_RBUTTONUP) 这些消息,鼠标点击时会产生,这是真的 mouse。 当你 postmessage是 ,是你 模拟 点击, 与 鼠标 不相关 ! 可能是 ::PostMessage(GetNowGameHwnd(),m_verMouseEvt[i]->GetMessage(),0,MAKELPARAM(pt.x,pt.y)); 太快 。 人眼 也 看不过来!试试: //休眠时间差 Sleep(200);//nSleep);
zgl7903 2013-12-24
  • 打赏
  • 举报
回复
瞎想一下 在HOOK键盘鼠标,在播放消息时过滤掉硬件键鼠消息 或在有硬件键鼠消息时暂停播放消息
菜头叔 2013-12-24
  • 打赏
  • 举报
回复
希望这个问题不要沉了,这个奇葩的问题解决了又可以造福社会了
oopkindy 2013-12-24
  • 打赏
  • 举报
回复
围观的·· 大神都很厉害啊
菜头叔 2013-12-24
  • 打赏
  • 举报
回复
就是拖着拖着就无法拖动了,如果把线程中的Postmessage 注释掉就OK了,我不明白为什它会导致这个问题,希望大神能持续关注这个问题
菜头叔 2013-12-24
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
xp sp2 上 运行 exe , 没发现 B 抢 焦点, 只是 A 很难拖动。
就是这个问题啊,你拖动A窗口拖着拖着鼠标焦点就自动掉了,应为被B中的Postmessage抢掉了。 就是这个问题。 终于有人关注了,感动的流鼻涕啊。。。。。
schlafenhamster 2013-12-23
  • 打赏
  • 举报
回复
有空看看 是设么问题
菜头叔 2013-12-23
  • 打赏
  • 举报
回复
菜头叔 2013-12-23
  • 打赏
  • 举报
回复
非常感谢你的回答,可能是我描述不够清楚,我谢了个dome传上来了,希望有大大帮忙看看,感激不尽。 http://pan.baidu.com/s/1jGA003G 1.在A窗口上面点击 Start进行录制 2.在B窗口上随便点击下 3.点击A窗口上的Stop停止录制 4.点击A窗口上的Replay进行回放,这个时候会向B窗口PostMessage刚才录制的鼠标消息。 5.点击replay之后拖动A窗口不停的移动它,你会发现在它向B窗口PostMssage的时候鼠标焦点被抢掉了。 这个问题困扰我很久了,一直没有解决。 不知道CSDN上面有没有大牛可以帮忙提点提点
schlafenhamster 2013-12-23
  • 打赏
  • 举报
回复
xp sp2 上 运行 exe , 没发现 B 抢 焦点, 只是 A 很难拖动。
xiaohuh421 2013-12-19
  • 打赏
  • 举报
回复
m_verMouseEvt[i]->GetMessage() 不知道你这句是在做什么. 原来做外挂的时候, Post, Send都没出现过你说的这个问题. 多开游戏在后台自动运行, 前台自己做自己的.
菜头叔 2013-12-19
  • 打赏
  • 举报
回复

15,979

社区成员

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

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