web-dev-qa-db-fra.com

Obtenez HWND sur Windows avec Qt5 (de WId)

J'essaie de convertir une application Qt4 en Qt5 . La seule chose que je n'ai pas pu comprendre, c'est comment obtenir le HWND d'un widget . Le programme utilise EcWin7 pour afficher la progression sur l’icône de la barre des tâches sous Win 7+, mais attend un HWND. La bibliothèque elle-même semble bien se compiler après avoir changé Q_WS_WIN en Q_OS_WIN) Dans Qt4 sous Windows WId, il ne s'agissait que d'un typedef pour HWND, donc ce n'était pas problem . Dans Qt5, ce n'est plus le cas . J'ai trouvé quelques envoi sur une liste de diffusion qui pourrait donner un indice, mais il semble que QPlatformNativeInterface ne fait plus partie de l'API publique de Qt5. .

Le programme appelle EcWin7.init (this-> winId ()); et j'ai besoin d'un moyen de convertir cet ID en HWND id ou d'un autre moyen d'obtenir ceci.

29
Josef

Dans Qt5, winEvent a été remplacé par nativeEvent:

bool winEvent(MSG* pMsg, long* result)

est maintenant

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

Et dans EcWin7::winEvent vous devez convertir void en MSG:

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

J'ai réussi à faire en sorte que l'application fonctionne! Il suffit de remplacer:

 mWindowId = wid;

avec

 mWindowId = (HWND)wid;
21
MrElmar
#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; 
}
10
KindDragon

Vous pouvez essayer:

(HWND)QWidget::winId();
2
TheFox

winId () a travaillé pour moi sur Qt 5.1au moins, il a la même valeur quand j'utilise 

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

    return false;
}

et

qDebug() << winId();
1
user1111324

Essayez cette fonction: QWindowsNativeInterface::nativeResourceForWindow

1
Filippok