我正在扩展一个在 Windows 上运行的商业应用程序。它可以通过插件进行扩展,对于这个应用程序来说,插件是普通的 DLL。从插件 DLL 导出的自由函数可以挂接到主机应用程序 UI,形成命令,并且这些命令可以基于用户与主机应用程序 UI 的交互来使用。此外,看起来插件与宿主应用程序在同一个线程中运行,或者至少所有插件都在同一个线程中运行。
也可以为这些插件编写用户界面。由于宿主应用程序是从另一个平台移植的,用户界面使用窗口作为主窗口和对话框面板的主要容器,但窗口内容及其控件是所有者绘制的。
应用程序附带的示例插件使用编写 Windows 用户界面的老式方式 - 它们具有标准资源文件、标准窗口过程、标准对话框过程、使用 GetMessage()、TranslateMessage()、DispatchMessage 的标准事件循环()。
这些示例插件中的 Windows 是在插件 DLL 函数之一中创建的。事件循环也在那里运行。
在这些示例中,可以创建模态和非模态窗口,并且集成似乎工作正常。只是视觉风格“有点”混合。
甚至有可能,或者更好的是,由于简单的示例设计,不允许多次调用该命令,这会打开多个相同类型的窗口,但看起来一切正常。
我想将 Qt 用于我的插件的 UI。但是,当我这样做时,主机用户界面就会停止反应。它甚至没有重新粉刷。
最初我使用 QApplication.exec(),它阻止了一切,但很快我就学会了不调用它。相反,我保留示例应用程序中的原始消息循环,并在其中调用 QApplication.processEvent()。但它仍然不起作用。
我想知道,当 Qt 应用程序的行为如此不同时,那里发生了什么?Qt 是否阻止了某些消息或发生了什么?
我也尝试过集成QWinWidget,但效果类似。