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

Posted

技术标签:

【中文标题】MFC C++:setfocus 也设置捕获吗?【英文标题】:MFC C++: does setfocus set the capture as well? 【发布时间】:2011-11-20 16:05:37 【问题描述】:

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

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

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

谁能给我解释一下?

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

【问题讨论】:

我认为您的意思是SetCapture 而不是SetCaption?如果是这样,您可能想要编辑您的帖子并修复它;如果没有,恐怕你的问题对我来说毫无意义。 :) eladyanni22 - 我们真的需要更多信息。您以无意义的方式使用术语鼠标和键盘捕获(请参阅罗德里戈的回答 - 他是正确的)。通常在调用 DoModal 时不会调用任何类型的捕获函数。此外,很少在调用上下文之外调用 DoModal(即创建对话框实例的函数,然后调用该对话框的 DoModal 以“运行”对话框。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

我明白了......如果我在一个窗口上执行:'setCapture',它会将鼠标输入焦点保持在我的应用程序中,直到我在另一个窗口上调用'releaseCapture'或'setCapture'窗户?? @eladyanai22 不,也没有“鼠标焦点”之类的东西。请记住,只有“键盘焦点”和“鼠标捕捉”。并且鼠标捕获具有严格的安全限制,无法将其用作一般的强制聚焦机制。鼠标捕获主要用于希望拖放到源窗口之外的拖放(或类似)操作。其他任何事情都是通向挫折的道路。

以上是关于MFC C++:setfocus 也设置捕获吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC (C++) 中捕获并保存窗口的屏幕截图

如何捕获从 MFC Web 浏览器 C++ 发出的 GET/POST 请求

MFC (C++):如何按设计设置 ListBox 的宽度?

MFC使控件失去焦点的方法

MFC:将焦点设置到子窗口时如何防止应用程序成为前台窗口

单击控件时在MFC中选择CEdit控件的内容