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:将焦点设置到子窗口时如何防止应用程序成为前台窗口的主要内容,如果未能解决你的问题,请参考以下文章