我在DLL中有一个Qt应用程序,我需要与第三方非Qt Windows应用程序集成。我不拥有第三方应用程序,因此无法更改其核心事件处理机制(在某些情况下我甚至没有源代码)。这样做的最佳方式是什么?
我尝试了QtWinMigrate框架,但是这让我改变了CWinApp :: Run,这是我无法做到的。如果我改为创建QApplication并调用exec(),则会创建第二个事件循环。这种工作,但是一些非Qt应用程序事件现在神秘地消失了(例如工具提示和键盘命令停止工作)。
任何想法都非常感激。感谢。
答案 0 :(得分:1)
我不相信有一个干净的解决方案(但我可能错了)。
无论如何,您可以使用QCoreApplication::setEventFilter
来获取一些关键事件(按键,鼠标悬停等)并将它们提供给应用程序事件循环。这很难看,但它可能会完成工作。
QCoreApplication::setEventFilter
收到具有以下签名的函数:
bool myEventFilter(void *message, long *result);
在Windows上,message
可以静态投放到MSG
。我对Windows API的了解有些严重,但查找相关事件应该不难。
我必须强调,我非常不喜欢这个解决方案。我真的会在不使用Qt的情况下编写插件。但它应该有效,即使是以非常丑陋的方式。
答案 1 :(得分:0)
QtWinMigrate是解决此问题的正确方法。它解决了Win32中的Qt或MFC事件循环问题。您无需更改CWinApp::Run
QMfcApp::pluginInstance
是Qt DLL与MFC事件循环一起使用所需的。你在DllMain中设置了它:
#include <Windows.h>
#include "qmfcapp.h"
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved )
{
static bool ownApplication = false;
if ( dwReason == DLL_PROCESS_ATTACH ) {
ownApplication = QMfcApp::pluginInstance( hInstance );
}
if ( dwReason == DLL_PROCESS_DETACH && ownApplication ) {
delete qApp;
}
return TRUE;
}