0

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

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

如果我在 DoModal 之前调用 setfocus,它就不起作用,但如果我在 DoModal 之前调用 setCapture,它就起作用。

谁能给我解释一下?

问题是什么?我想了解为什么我需要在 DoModal 之前调用 setCapture 或 releaseCapture (顺便说一句,releaseCapture 也可以......)

4

1 回答 1

6

没有“键盘捕获”之类的东西。只有键盘焦点。

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

也就是说,您真的需要捕获鼠标吗?实际上这很少需要。并且它应该只作为用户操作的结果来完成,而不是你自己。

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

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

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

于 2011-11-20T17:05:41.263 回答