模态对话框不作为最顶层窗口打开
Posted
技术标签:
【中文标题】模态对话框不作为最顶层窗口打开【英文标题】:Modal Dialogs do not open as topmost window 【发布时间】:2015-04-16 08:17:57 【问题描述】:我们公司正在销售两种使用 MFC 8.0 用 C++ 编写的不同应用程序
在这两个应用程序中,我们创建并打开如下模式对话框:
dlg_options myOptions;
myOptions. DoModal();
这就是我们近 10 年来的做法。 我们有数百名客户使用各种 Windows 版本(XP 到 8.1),并且一直以这种方式运行良好。
几周前,我们有一个客户,应用程序的模式对话框没有作为最顶部的窗口打开。它们留在后台,您必须手动激活它们才能将它们带到前面。
我无法解决这个问题,但客户在他的机器(Win 8.1)上安装了一些 Windows 扩展,比如不同的开始菜单,所以我发现了一些问题。事实上,这个系统被搞砸了。甚至不止一个开始菜单应用程序!重新安装 Windows 后一切正常。
今天,我在使用不同的应用程序和不同的客户时再次遇到了同样的问题。他的系统又是 Window 8.1 但这次我找不到任何 Windows 扩展。
两个系统有一个共同点。您无法使用 tab + alt 键在应用程序之间切换。即使我们的软件没有运行,您也无法切换。当我们的应用程序运行时,您可以使用 tab + alt 将模式对话框从后台带回前台。这很好,但窗口应该从一开始就在前台。
我不知道那里发生了什么,也没有办法找到这个错误。 有没有人有类似的经历? 这是怎么回事?
【问题讨论】:
如果你的对话框没有出现在前面,是不是你的应用程序窗口在任务栏中闪烁?有一些涉及调用SetWindowPos
的技巧可以强制进行相对定位,但如果您的应用程序当时处于后台,您最终可能会因为抓住焦点而惹恼用户。
【参考方案1】:
我在这里发现了一个类似的问题:Focus on Modal Dialog (MFC)
对话框的父级似乎有问题。您可以尝试如下声明:
CMyDlg dlg(this);
希望对你有帮助。
【讨论】:
【参考方案2】:你应该通过调用来做到这一点:
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
【讨论】:
以上是关于模态对话框不作为最顶层窗口打开的主要内容,如果未能解决你的问题,请参考以下文章