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

时间:2008-09-01 13:15:34

标签: winapi com

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

此COM组件的完整界面对应于化学过程行业中使用的软件标准(CAPE-OPEN),因此该COM组件应该可以被我的一系列第三方可执行文件使用控制。

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

但是,如果我在::MessageBox()之前立即调用DoModal()对话框,并且在首次显示MessageBox后行为正确。

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

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

对话框本身是ATL / WTL CPropertySheetImpl。

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

我知道我可以成功调用::MessageBox()或从我的COM组件显示标准Windows文件对话框,然后我可以显示我的自定义对话框。如果没有先显示“标准”对话框,我就无法显示自定义对话框。

有人可以建议我如何在没有首先显示不必要的MessageBox的情况下显示对话框吗?我知道这是可能的,因为我看到这个EXE显示对应于同一界面的其他COM组件的对话框。

5 个答案:

答案 0 :(得分:1)

您是否使用Dialog的父级? e.g。

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

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

答案 1 :(得分:1)

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

    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
<\ n>在WinMain中。

答案 2 :(得分:1)

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

警告 - 如果您的应用程序崩溃,它将随之关闭桌面。但我有兴趣看看它是否有效。

答案 3 :(得分:1)

事实证明我错了:

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

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

感谢您的回答; - )

答案 4 :(得分:0)

无论您做什么,都不使用桌面窗口作为模式对话框的父级。

请点击此处查看说明:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx

引用理由:

  把它放在一起:如果一个人的主人   模态对话框是桌面,然后是   桌面变为禁用,其中   禁用所有后代。在   换句话说,它会禁用每个窗口   在系统中。即使你是一个人   试图显示!