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

ela*_*nai 0 c++ mfc setfocus

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

鼠标捕获仍然在它所在的最后一项上.

如果我在DoModal之前调用setfocus,它不起作用,但是如果我在DoModal之前执行setCapture它可以工作.

有谁可以向我解释一下?

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

rod*_*igo 5

没有"键盘捕捉"这样的东西.只有键盘焦点.

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

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

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

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

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