使用Qt5在Windows上获取HWND(来自WId)

时间:2012-12-27 02:08:44

标签: c++ windows qt user-interface qt5

我正在尝试将Qt4应用程序转换为Qt5。 我唯一想知道的是如何获取Widget的 HWND 。 该程序使用EcWin7显示win 7+上任务栏图标的进度,但需要 HWND 。将 Q_WS_WIN 更改为 Q_OS_WIN 后,lib本身似乎编译良好 在Windows上的Qt4 WId 只是 HWND 的typedef,所以这没问题。 在Qt5中,情况不再如此。 我找到了一些可以提供线索的mailing list posting,但似乎 QPlatformNativeInterface 不再是Qt5公共API的一部分了。

程序调用 EcWin7.init(this-> winId()); 并且我需要某种方式将此ID转换为 HWND id或其他得到这个的方法。

5 个答案:

答案 0 :(得分:21)

在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;

答案 1 :(得分:10)

#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; 
}

答案 2 :(得分:2)

您可以尝试:

(HWND)QWidget::winId();

答案 3 :(得分:2)

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();

答案 4 :(得分:1)

尝试此功能:QWindowsNativeInterface::nativeResourceForWindow