Получить 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;
}
Попробуйте эту функцию: 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();