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

Posted

技术标签:

【中文标题】MFC:将焦点设置到子窗口时如何防止应用程序成为前台窗口【英文标题】:MFC: How to prevent app from becoming foreground window when setting focus to a child window 【发布时间】:2011-12-13 14:50:06 【问题描述】:

我们有一个 MFC MDI 应用程序,在操作过程中可以将焦点设置在给定控件上,例如如果操作的结果更适合不同的选项卡,它可能会更改活动选项卡。

如果在 SetFocus 发生时应用程序具有焦点,这很好,选项卡会更改并且正确的控件具有焦点。但是,如果应用程序没有焦点(即用户在等待操作完成时单击了另一个应用程序),子窗口上的 SetFocus 会导致在父 MDI 框架中发生 OnActivate 并且应用程序成为前台窗口。

如果用户在另一个应用程序中工作,我们如何将焦点设置到子窗口而不使整个应用程序成为前台窗口。

【问题讨论】:

嗯,奇怪,不应该发生。有人在搞乱 AttachThreadInput() 吗? 我不知道,但这是 MFC,后台发生了很多事情。 我在多年的 MFC 编程中从未见过这种情况。您应该发布用于设置焦点的代码。您是从 GUI 线程还是从另一个线程调用它?您是从任何 Windows 消息的事件处理程序中调用它吗?如果您在 WM_TIMER 事件中设置焦点,也会发生这种情况吗?您使用什么操作系统?在 Windows 10 上,当用户正在使用另一个应用程序时,不再允许以编程方式将应用程序带到前台。解决方法是在应用不在前台时不设置焦点。 我在使用 C# 选项卡控件时遇到了类似的问题。当以编程方式更改选定的选项卡时,整个对话框来到前面,从当前活动窗口中窃取焦点。也许这有帮助:***.com/questions/4044711/… 【参考方案1】:

您是否尝试使用 CDialog::GotoDlgCtrl 更改焦点?

【讨论】:

感谢您的回答。我设置焦点的实际控制是 CWnd 派生而不是 CDialog。

以上是关于MFC:将焦点设置到子窗口时如何防止应用程序成为前台窗口的主要内容,如果未能解决你的问题,请参考以下文章

防止视图窃取焦点/将焦点设置到视图

MFC中如何将焦点设置到指定控件上

如何在MFC中创建非交互式窗口

如何在不将焦点转移到另一个窗口的情况下显示 MFC 对话框

如何在 MFC 中创建非交互式窗口

如何防止主窗口失去焦点?