it-swarm.com.ru

Получить 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 или каким-либо другим способом получить это.

29
Josef

В 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;
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

Вы можете попробовать:

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

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();
1
user1111324

Попробуйте эту функцию: QWindowsNativeInterface::nativeResourceForWindow

1
Filippok