我开发了一个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组件的对话框。
答案 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)
事实证明我错了:
所以现在我只需要找出如何将对话框放在前面。
感谢您的回答; - )
答案 4 :(得分:0)
无论您做什么,都不使用桌面窗口作为模式对话框的父级。
请点击此处查看说明:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx
引用理由:
把它放在一起:如果一个人的主人 模态对话框是桌面,然后是 桌面变为禁用,其中 禁用所有后代。在 换句话说,它会禁用每个窗口 在系统中。即使你是一个人 试图显示!