Ottieni HWND su Windows con Qt5 (da WId)

Sto cercando di convertire un’applicazione Qt4 in Qt5. L’unica cosa che non riuscivo a capire è come ottenere l’ HWND di un Widget. Il programma utilizza EcWin7 per mostrare l’avanzamento sull’icona della barra delle applicazioni su win 7+ ma si aspetta un HWND . La stessa lib sembra compilare bene dopo aver cambiato Q_WS_WIN in Q_OS_WIN ). In Qt4 su Windows WId era solo un typedef per HWND , quindi non era un problema. In Qt5 questo non è più il caso. Ho trovato alcuni post di mailing list che potrebbero dare un indizio ma sembra che QPlatformNativeInterface non sia più parte dell’API pubblica di Qt5.

Il programma chiama EcWin7.init (this-> winId ()); e ho bisogno di un modo per convertire questo ID nell’ID HWND o in un altro modo per ottenere questo.

In Qt5 winEvent stato sostituito da nativeEvent :

 bool winEvent(MSG* pMsg, long* result) 

è ora

 bool nativeEvent(const QByteArray & eventType, void * message, long *result) 

E in EcWin7::winEvent devi effettuare il cast da void a MSG :

 bool EcWin7::winEvent(void * message, long * result) { MSG* msg = reinterpret_cast(message); if (msg->message == mTaskbarMessageId) { ... 

Sono stato in grado di far funzionare l’applicazione! Basta sostituire:

  mWindowId = wid; 

con

  mWindowId = (HWND)wid; 
 #include  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(interface->nativeResourceForWindow(QByteArrayLiteral("handle"), window)); } return 0; } 

Puoi provare:

 (HWND)QWidget::winId(); 

winId () ha funzionato per me su Qt 5.1 almeno ha lo stesso valore quando sto usando

 bool Widget::nativeEvent(const QByteArray & eventType, void * message, long * result) { MSG* msg = reinterpret_cast(message); qDebug() << msg->hwnd; return false; } 

e

 qDebug() << winId(); 

Prova questa funzione: QWindowsNativeInterface::nativeResourceForWindow