Qt插件应用程序在第三方应用程序中

时间:2011-01-12 09:56:50

标签: qt

我在DLL中有一个Qt应用程序,我需要与第三方非Qt Windows应用程序集成。我不拥有第三方应用程序,因此无法更改其核心事件处理机制(在某些情况下我甚至没有源代码)。这样做的最佳方式是什么?

我尝试了QtWinMigrate框架,但是这让我改变了CWinApp :: Run,这是我无法做到的。如果我改为创建QApplication并调用exec(),则会创建第二个事件循环。这种工作,但是一些非Qt应用程序事件现在神秘地消失了(例如工具提示和键盘命令停止工作)。

任何想法都非常感激。感谢。

2 个答案:

答案 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;
}