Получить 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 (этом-> WinID ()); и мне нужно каким-то образом преобразовать этот идентификатор в HWND id или какой-то другой способ получить это.

29

Решение

В 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;
21

Другие решения

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

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

(HWND)QWidget::winId();
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();
1

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

0
По вопросам рекламы [email protected]