I am trying to convert a Qt4 Application to Qt5. The only thing I couldn\'t figure out is how to get the HWND of a Widget. The program uses EcWin7 to show the progr
winId() worked for me on Qt 5.1 at least it has the same value when I'm using
bool Widget::nativeEvent(const QByteArray & eventType, void * message, long * result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
qDebug() << msg->hwnd;
return false;
}
and
qDebug() << winId();
#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;
}
You may try:
(HWND)QWidget::winId();
Try this function: QWindowsNativeInterface::nativeResourceForWindow
In Qt5 winEvent
was replaced by nativeEvent
:
bool winEvent(MSG* pMsg, long* result)
is now
bool nativeEvent(const QByteArray & eventType, void * message, long *result)
And in EcWin7::winEvent
you have to cast void
to MSG
:
bool EcWin7::winEvent(void * message, long * result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
if (msg->message == mTaskbarMessageId)
{
...
I was able to get the application to work! Just replace:
mWindowId = wid;
with
mWindowId = (HWND)wid;