wake-up-neo.net

Holen Sie sich HWND unter Windows mit Qt5 (von WId)

Ich versuche, eine Qt4-Anwendung in Qt5 zu konvertieren. Das einzige, was ich nicht herausfinden konnte, ist, wie man die HWND eines Widgets erhält. Das Programm verwendet EcWin7 . zeigt den Fortschritt auf dem Taskleistensymbol in Win 7+ an, erwartet jedoch ein HWND. Die lib selbst scheint gut zu kompilieren, nachdem Q_WS_WIN in Q_OS_WIN) .__ geändert wurde. In Qt4 war WId unter Windows nur ein Typedef für HWND, also nein Problem . In Qt5 ist dies nicht mehr der Fall . Ich habe ein paar Mailing List Postings gefunden, die einen Hinweis geben könnten, aber es scheint, dass QPlatformNativeInterface nicht mehr Teil der öffentlichen API von Qt5 ist .

Das Programm ruft EcWin7.init (this-> winId ()) auf; und ich muss eine Möglichkeit, diese ID in die HWND -ID oder eine andere Möglichkeit umzuwandeln, um diese zu erhalten.

29
Josef

In Qt5 wurde winEvent durch nativeEvent ersetzt:

bool winEvent(MSG* pMsg, long* result)

ist jetzt

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

Und in EcWin7::winEvent musst du void in MSG umwandeln:

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

Ich konnte die Anwendung zum Laufen bringen! Ersetzen Sie einfach:

 mWindowId = wid;

mit

 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

Sie können versuchen:

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

winId () hat für mich an Qt 5.1 gearbeitet 

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

    return false;
}

und

qDebug() << winId();
1
user1111324

Versuchen Sie diese Funktion: QWindowsNativeInterface::nativeResourceForWindow

1
Filippok