关于winapi:如何从隐藏的窗口应用程序中显示对话框?

关于winapi:如何从隐藏的窗口应用程序中显示对话框?

How do you display a dialog from a hidden window application?

我开发了一个 COM 组件 (dll),它实现了一个显示 WTL 模式对话框的 Edit() 方法。

这个 COM 组件的完整接口对应于化学过程工业中使用的软件标准 (CAPE-OPEN),因此这个 COM 组件应该可以被我不知道的一系列第 3 方可执行文件使用控制。

我的组件在许多这些 EXE 中都按预期工作,但特别是其中一个 Edit() 方法只是挂起而没有出现对话框。

但是,如果我在 DoModal() 之前立即调用 ::MessageBox(),则对话框会在第一次显示 MessageBox 后显示并正确运行。

我怀疑问题可能与这个作为"隐藏窗口应用程序"运行的特定 EXE 有关。

我尝试使用 NULL 和 ::GetConsoleWindow() 的返回值作为对话框的父级,但都没有工作。

对话框本身是一个 ATL/WTL CPropertySheetImpl。

有问题的父应用程序 (EXE) 不受我的控制,因为它是由(轻度敌对的)第 3 方开发的。

我知道我可以成功地调用 ::MessageBox() 或从我的 COM 组件中显示标准的 Windows 文件对话框,并且在这样做之后我就可以显示我的自定义对话框。如果不先显示"标准"对话框,我将无法显示我的自定义对话框。

谁能建议我如何在不先显示不必要的 MessageBox 的情况下让它显示对话框?我知道这是可能的,因为我已经看到这个 EXE 显示来自其他 COM 组件对应于同一接口的对话框。


原来我错了:

  • 如果我使用 NULL 父级创建我的对话框,则它不会显示,并挂起父应用程序
  • 但是,如果我使用 ::GetConsoleWindow() 作为父级创建对话框,则会显示对话框;它只是愚弄了我,因为它显示在启动父应用程序的应用程序的窗口后面

所以现在我只需要找出如何将我的对话放在前面。

感谢您的回答;-)


这不应该是可靠的 - 但尝试 ::GetDesktopWindow() 作为父级(它返回一个 HWND)。

请注意 - 如果您的应用程序崩溃,它会导致桌面崩溃。但我很想看看它是否有效。


根据"隐藏窗口"应用程序的工作方式,它可能无法显示窗口。例如,服务没有"主消息循环",因此无法在进程中处理发送到窗口的消息。即,显示窗口的应用程序应具有以下内容:

1
2
3
4
5
6
7
8
    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

在 WinMain 中。


您是否为对话框使用父级?例如

1
2
MyDialog dialog(pParent);
dialog.DoModal();

如果是,请尝试删除父级。特别是如果父级是桌面窗口。


无论您做什么,都不要将桌面窗口用作模态对话框的父窗口。

解释见这里:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx

引用理由:

Put this together: If the owner of a
modal dialog is the desktop, then the
desktop becomes disabled, which
disables all of its descendants. In
other words, it disables every window
in the system. Even the one you're
trying to display!


推荐阅读

    linux中ps命令显示?

    linux中ps命令显示?,系统,信息,状态,进程,命令,多地,软件,工作,基础,报告,lin

    linux命令逐页显示?

    linux命令逐页显示?,系统,工作,地址,命令,网上,信息,百度,基础,标准,内容,在l

    显示等号linux命令?

    显示等号linux命令?,工作,地址,信息,系统,命令,目录,标准,管理,基础,常用命

    linux中显示路径命令?

    linux中显示路径命令?,系统,地址,工作,信息,时间,命令,数据,网络,路径,名字,l

    linux命令多显示几行?

    linux命令多显示几行?,实时,系统,标准,数据,档案,命令,文件,最新,信息,状态,l

    linux命令行显示键值?

    linux命令行显示键值?,系统,环境,管理,文化,国家,信息,工具,数据,软件,项目,L

    linux用命令显示键盘?

    linux用命令显示键盘?,系统,信息,工具,电脑,键盘,分析,设备,数据,通用,工作,L

    linux命令分行显示?

    linux命令分行显示?,数据,分行,系统,时间,最新,百度,实时,命令,文件,内容,lin

    linux显示路径命令?

    linux显示路径命令?,系统,信息,工作,数据,名称,位置,标准,环境,时间,命令,lin

    linux简单的显示命令?

    linux简单的显示命令?,工具,管理,系统,档案,工作,信息,命令,标准,技术,设备,L

    linux显示用户名命令?

    linux显示用户名命令?,密码,系统,信息,时间,地址,命令,用户,用户名,位置,用

    linux下命令显示行号?

    linux下命令显示行号?,工作,地址,系统,信息,命令,档案,文件,名称,观察,实时,L

    linux命令行最多显示?

    linux命令行最多显示?,信息,系统,数据,档案,标准,文件,命令,名称,地址,最新,l

    linux只显示命令行?

    linux只显示命令行?,系统,密码,工具,终端,信息,暂停,地方,代码,发行,首页,Lin

    linux全屏显示命令?

    linux全屏显示命令?,系统,工具,电脑,软件,数据,上会,环境,位置,虚拟机,分辨

    linux命令框显示乱码?

    linux命令框显示乱码?,系统,信息,环境,软件,项目,情况,乱码,中文,终端,字符

    linux显示到屏幕命令?

    linux显示到屏幕命令?,工具,命令,地址,标准,系统,名字,技术,最新,工作,信息,

    linux命令显示翻页?

    linux命令显示翻页?,地址,工作,命令,标准,管理,环境,系统,信息,暂停,文件,Lin

    linux显示硬盘命令?

    linux显示硬盘命令?,系统,情况,信息,单位,服务,命令,数据,工具,地址,管理,怎

    linux命令显示总大小?

    linux命令显示总大小?,系统,情况,信息,命令,单位,服务,第一,档案,大小,文件