模态对话框不作为最顶层窗口打开

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);

【讨论】:

以上是关于模态对话框不作为最顶层窗口打开的主要内容,如果未能解决你的问题,请参考以下文章

QT开发(二十)——QT对话框

模态窗口和控件显示前后

如何在 WPF 中制作模态对话框?

模态对话框位于 Opensuse 其他窗口的后面

从 iframe 打开一个模态窗口到父窗口

捕获新创建的模态对话框的窗口句柄