我有一个调用DoModal()的CDialog,对话框被打开,其他一切都被禁用,但由于某种原因我只有键盘捕获而不是鼠标。
鼠标捕获仍然在它所在的最后一个项目上。
如果我在DoModal之前调用setfocus,它不起作用,但是如果我在DoModal之前执行setCapture它会起作用。
有人可以向我解释一下吗?
有什么问题?我想了解为什么我需要在DoModal之前调用setCapture或releaseCapture(btw-releaseCapture也可以...)
答案 0 :(得分:5)
没有'键盘捕捉'。只有键盘焦点。
具有键盘焦点的窗口是接收键盘相关消息的窗口。 鼠标消息通常发送到鼠标光标正下方的窗口,而不考虑焦点。这是除非鼠标被捕获",在这种情况下,鼠标消息被发送到捕获鼠标的窗口,无论鼠标光标在哪里。
那就是说,你真的需要捕捉鼠标吗?实际上这很少是必要的。它应该仅仅是用户操作的结果,而不是你自己的。
PS。出于安全考虑,在Windows中实际上有两种不同的鼠标捕获方式:
SetCapture
函数只有在处理WM_?BUTTON_DOWN消息时调用它才会创建全局捕获。