Winapi 如何显示隐藏窗口应用程序中的对话框?
我开发了一个COM组件(dll),它实现了显示WTL模式对话框的Edit()方法 此COM组件的完整接口对应于化学过程工业中使用的软件标准(CAPE-OPEN),因此此COM组件应可供我无法控制的一系列第三方可执行文件使用 我的组件在许多这样的exe中都能正常工作,但对于其中一个exe,Edit()方法只是挂起而没有出现对话框 但是,如果我在Winapi 如何显示隐藏窗口应用程序中的对话框?,winapi,com,Winapi,Com,我开发了一个COM组件(dll),它实现了显示WTL模式对话框的Edit()方法 此COM组件的完整接口对应于化学过程工业中使用的软件标准(CAPE-OPEN),因此此COM组件应可供我无法控制的一系列第三方可执行文件使用 我的组件在许多这样的exe中都能正常工作,但对于其中一个exe,Edit()方法只是挂起而没有出现对话框 但是,如果我在DoModal()之前立即调用::MessageBox(),则在第一次显示MessageBox之后,对话框将显示并正常运行 我怀疑这个问题可能与这个作为“隐
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()作为父对象创建对话框,则会显示该对话框;它只是愚弄了我,因为它显示在启动父应用程序的应用程序的窗口后面
谢谢你的回答;-) 无论您做什么,都不要使用桌面窗口作为模式对话框的父窗口 有关说明,请参见此处: 引述理由: 把这些放在一起:如果 模式对话框是桌面,然后是 桌面将被禁用,这将导致 禁用其所有子体。在里面 换句话说,它禁用每个窗口 在系统中。即使是你所爱的人 试图展示