WndProc 鼠标移出客户区消息丢失问题
vb吧
全部回复
仅看楼主
level 11
余思培
楼主
当鼠标移出窗体客户区时,有时消息会丢失怎么处理?
2021年06月09日 15点06分
1
level 11
余思培
楼主
如题,我在之前写的WndProc上添加了一段代码,用以向鼠标移动到某个区域时或移出某个区域时,发送WM_SETFOCUS和WM_KILLFOCUS消息,但是在实际运行中,有时会WndProc会接受不到鼠标移出窗体消息,导致WM_KILLFOCUS消息不能正常发送,该如何处理?
2021年06月09日 15点06分
3
level 13
隨風🍁缒夢
一种是用Timer定时,WindowFromPoint来判断是否为当前窗口的句柄,区分是否离开。另一种是TrackMouseEevent后拦截WM_MOUSELEAVE来处理离开消息(这个是推荐的做法)
2021年06月09日 15点06分
4
隨風🍁缒夢
TrackMouseEevent的结构可以处理鼠标首次进入和离开两种
2021年06月09日 15点06分
余思培
我在网上找到的处理方法(包括MSDN)使用的都是TrackMouseEvent,但目前尝试还未成功,我明天再试下
2021年06月09日 16点06分
yjryym
第一种用Timer很难设置到合适的检测频率,而且消息优先级低。第二种虽然官方的标准做法,但是需要子类化在VB6里面不是很方便。我还有第三种方案,就是SetCapture。
2021年06月11日 02点06分
yjryym
@yjryym
在MouseMove事件里面用SetCapture捕获对应的控件,判断SetCapture的返回值就能知道是否是刚进入,捕获后即便鼠标离开控件区域,该控件也会接收MouseMove事件,所以这时候再用WindowFromPoint来检测是否离开。
2021年06月11日 02点06分
level 13
隨風🍁缒夢
@yjryym
SetCapture的问题:
1.SetCapture窗口的上层有其他窗口,则鼠标从SetCapture窗口移到上层窗口上不会执行MouseMove事件,也就无法判断离开
2.SetCapture窗口放在开始菜单的位置,鼠标移到SetCapture窗口,按系统徽标键则弹出开始菜单,此时鼠标已经在开始菜单上,而SetCapture窗口还是进入的状态,而且无法得知离开
2021年06月11日 03点06分
5
隨風🍁缒夢
第2种情况是顶层窗口HWND_TOPMOST引起的,普通窗口只要鼠标离开SetCapture的窗口区域还是可以处理离开的,顶层窗口的话就不行,顶层窗口就算拖走得很远SetCapture窗口还是得不到离开,所以还是斟酌用SetCapture
2021年06月11日 03点06分
隨風🍁缒夢
或者SetCapture时用WindowFromPoint判断一下窗口句柄要好些
2021年06月11日 04点06分
1