在Windows上获取HWND与QT5(从WID)(Get HWND on windows with

2019-07-17 15:19发布

我尝试转换的Qt4应用QT5。 我无法弄清楚的唯一的事情是如何得到一个Widget的HWND。 该方案采用EcWin7显示上取胜7+任务栏图标的进展,但需要一个HWND。 的lib本身似乎在Windows上编译WID改变Q_WS_WINQ_OS_WIN)在Qt4的只是一个typedef的HWND后细,所以这是没有问题的。 在这QT5不一样了。 我发现了一些邮件列表中 ,可以给一个线索,但似乎QPlatformNativeInterface不是QT5的公共API的一部分了。

程序调用EcWin7.init(这- > winId()); 我需要一些方法来这个ID转换成HWND ID或一些其他的方式来得到这个。

Answer 1:

在QT5 winEvent改为nativeEvent

bool winEvent(MSG* pMsg, long* result)

就是现在

bool nativeEvent(const QByteArray & eventType, void * message, long *result)

而在EcWin7::winEvent你要投void ,以MSG

bool EcWin7::winEvent(void * message, long * result)
{
    MSG* msg = reinterpret_cast<MSG*>(message);
    if (msg->message == mTaskbarMessageId)
    {
      ...

我能得到应用工作! 只需更换:

 mWindowId = wid;

 mWindowId = (HWND)wid;


Answer 2:

#include <QtGui/5.0.0/QtGui/qpa/qplatformnativeinterface.h>

static QWindow* windowForWidget(const QWidget* widget) 
{
    QWindow* window = widget->windowHandle();
    if (window)
        return window;
    const QWidget* nativeParent = widget->nativeParentWidget();
    if (nativeParent) 
        return nativeParent->windowHandle();
    return 0; 
}

HWND getHWNDForWidget(const QWidget* widget)
{
    QWindow* window = ::windowForWidget(widget);
    if (window && window->handle())
    {
        QPlatformNativeInterface* interface = QGuiApplication::platformNativeInterface();
        return static_cast<HWND>(interface->nativeResourceForWindow(QByteArrayLiteral("handle"), window));
    }
    return 0; 
}


Answer 3:

你可以试试:

(HWND)QWidget::winId();


Answer 4:

试试这个功能: QWindowsNativeInterface::nativeResourceForWindow



Answer 5:

winId()为我工作Qt的5.1至少它具有相同的价值,当我使用

bool Widget::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
    MSG* msg = reinterpret_cast<MSG*>(message);
    qDebug() << msg->hwnd;

    return false;
}

qDebug() << winId();


文章来源: Get HWND on windows with Qt5 (from WId)