Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何显示隐藏窗口应用程序中的对话框?_Winapi_Com - Fatal编程技术网

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

Winapi 如何显示隐藏窗口应用程序中的对话框?,winapi,com,Winapi,Com,我开发了一个COM组件(dll),它实现了显示WTL模式对话框的Edit()方法 此COM组件的完整接口对应于化学过程工业中使用的软件标准(CAPE-OPEN),因此此COM组件应可供我无法控制的一系列第三方可执行文件使用 我的组件在许多这样的exe中都能正常工作,但对于其中一个exe,Edit()方法只是挂起而没有出现对话框 但是,如果我在DoModal()之前立即调用::MessageBox(),则在第一次显示MessageBox之后,对话框将显示并正常运行 我怀疑这个问题可能与这个作为“隐

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

此COM组件的完整接口对应于化学过程工业中使用的软件标准(CAPE-OPEN),因此此COM组件应可供我无法控制的一系列第三方可执行文件使用

我的组件在许多这样的exe中都能正常工作,但对于其中一个exe,Edit()方法只是挂起而没有出现对话框

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

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

我已经尝试使用NULL和
::GetConsoleWindow()
中的返回值作为对话框的父级,两者都不起作用

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

所讨论的父应用程序(EXE)不在我的控制范围内,因为它是由(轻度敌对的)第三方开发的

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


有人能建议我如何让它显示对话框而不首先显示不必要的消息框吗?我知道这是可能的,因为我看到这个EXE显示了来自与同一接口对应的其他COM组件的对话框。

您是否使用该对话框的父级?e、 g

MyDialog dialog(pParent);
dialog.DoModal();
如果是,请尝试删除父级。尤其是当父窗口是桌面窗口时。

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

    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

在WinMain中。

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


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

结果我错了:

  • 如果我使用空的父应用程序创建对话框,则不会显示该对话框,并挂起父应用程序
  • 但是,如果我以::GetConsoleWindow()作为父对象创建对话框,则会显示该对话框;它只是愚弄了我,因为它显示在启动父应用程序的应用程序的窗口后面
所以现在我只需要找出如何把我的对话带到前台


谢谢你的回答;-)

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

有关说明,请参见此处:

引述理由:

把这些放在一起:如果 模式对话框是桌面,然后是 桌面将被禁用,这将导致 禁用其所有子体。在里面 换句话说,它禁用每个窗口 在系统中。即使是你所爱的人 试图展示