Получить HWND на окнах с Qt5 (из WId)

Я пытаюсь преобразовать приложение Qt4 в Qt5. Единственное, что я не мог понять, это как получить HWND виджета. Программа использует EcWin7, чтобы показать прогресс на значке панели задач на win 7+, но ожидает HWND. Кажется, что сама библиотека нормально компилируется после изменения Q_WS_WIN на Q_OS_WIN) В Qt4 в Windows WId был просто typedef для HWND, так что это не было проблемой. В Qt5 это уже не так. Я нашел некоторую публикацию в списке рассылки, которая могла бы дать подсказку, но кажется, что QPlatformNativeInterface больше не является частью общедоступного API Qt5.

Программа вызывает EcWin7.init(this->winId()); и мне нужно каким-то образом преобразовать этот идентификатор в идентификатор HWND или каким-либо другим способом получить это.

5 ответов

Решение

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

Вы можете попробовать:

(HWND)QWidget::winId();

Попробуйте эту функцию: QWindowsNativeInterface::nativeResourceForWindow

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();
Другие вопросы по тегам