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

标签 winapi com

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

此 COM 组件的完整接口(interface)对应于化学加工行业 (CAPE-OPEN) 中使用的软件标准,因此此 COM 组件应该可供一系列不在我的范围内的第三方可执行文件使用。控制。

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

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

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

我尝试过使用 NULL 和 ::GetConsoleWindow() 的返回值作为对话框的父项,但都不起作用。

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

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

我确实知道我可以成功调用 ::MessageBox() 或从 COM 组件显示标准 Windows 文件对话框,并且在执行此操作后我可以显示我的自定义对话框。我只是无法在不先显示“标准”对话框的情况下显示我的自定义对话框。

任何人都可以建议我如何让它显示对话框而不首先显示不必要的消息框?我知道这是可能的,因为我已经看到此 EXE 显示来自与同一接口(interface)对应的其他 COM 组件的对话框。

最佳答案

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

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

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

关于winapi - 如何从隐藏窗口应用程序中显示对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37920/

相关文章:

c++ - 如何最好地将 VARIANT_BOOL 转换为 C++ bool?

c# - 从 STA 线程调用 COM 对象导致某些机器上出现 TYPE_E_LIBNOTREGISTERED

c++ - 在 C++ 中使用 DirectShow 或其他 COM 库时,我#import 哪些 DLL?

c - LPSTREAM 将整个 Stream 内容读入 unsigned char* 数组

c++ - 识别访问互联网的进程

C++ WinAPI 读取进程内存

c++ - 如何获取安装的 Windows SDK 版本?

c++ - 在不禁用其 key 的情况下注册全局热键

c# - 尝试包装 COM 接口(interface)使其 IDisposable 时出现意外的 C# 编译器错误

winapi - 标准COM编码(marshal)处理程序失败,并显示REGDB_E_IIDNOTREG