MFC C ++:setfocus也设置了捕获吗?

时间:2011-11-20 16:05:38

标签: c++ mfc setfocus

我有一个调用DoModal()的CDialog,对话框被打开,其他一切都被禁用,但由于某种原因我只有键盘捕获而不是鼠标。

鼠标捕获仍然在它所在的最后一个项目上。

如果我在DoModal之前调用setfocus,它不起作用,但是如果我在DoModal之前执行setCapture它会起作用。

有人可以向我解释一下吗?

有什么问题?我想了解为什么我需要在DoModal之前调用setCapture或releaseCapture(btw-releaseCapture也可以...)

1 个答案:

答案 0 :(得分:5)

没有'键盘捕捉'。只有键盘焦点。

具有键盘焦点的窗口是接收键盘相关消息的窗口。 鼠标消息通常发送到鼠标光标正下方的窗口,而不考虑焦点。这是除非鼠标被捕获",在这种情况下,鼠标消息被发送到捕获鼠标的窗口,无论鼠标光标在哪里。

那就是说,你真的需要捕捉鼠标吗?实际上这很少是必要的。它应该仅仅是用户操作的结果,而不是你自己的。

PS。出于安全考虑,在Windows中实际上有两种不同的鼠标捕获方式:

  • 本地捕获:只有当鼠标位于属于同一应用程序的窗口上时,才会将鼠标消息发送到捕获窗口。
  • 全局捕获:无论鼠标光标在何处,都会将鼠标消息发送到捕获窗口。

SetCapture函数只有在处理WM_?BUTTON_DOWN消息时调用它才会创建全局捕获。