web-dev-qa-db-ja.com

Qt5を使用してWindowsでHWNDを取得(WIdから)

Qt4アプリケーションをQt5に変換しようとしています。私が理解できなかった唯一のことは、ウィジェットの[〜#〜] hwnd [〜#〜]を取得する方法です。プログラムは EcWin7 を使用してwin 7+のタスクバーアイコンに進行状況を表示しますが、[〜#〜] hwnd [〜#〜]が必要です。 Q_WS_WINQ_OS_WIN)に変更した後、lib自体は問題なくコンパイルされるようですWId[〜#〜] hwnd [〜#〜]のtypedefであったため、これは問題ありませんでした。 Qt5では、これはもう当てはまりません。私はいくつかの メーリングリストの投稿 を見つけましたが、手掛かりを与えることができますが、Qt5のパブリックAPIの一部ではないQPlatformNativeInterfaceのようです.

プログラムはEcWin7.init(this-> winId());を呼び出し、このIDを[〜#〜に変換する何らかの方法が必要です] hwnd [〜#〜]idまたはこれを取得する他の方法。

30
Josef

Qt5では、winEventnativeEventに置き換えられました。

bool winEvent(MSG* pMsg, long* result)

今でしょ

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

EcWin7::winEventvoidMSGにキャストする必要があります。

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

アプリケーションを動作させることができました!単に交換してください:

 mWindowId = wid;

 mWindowId = (HWND)wid;
22
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; 
}
11
KindDragon

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

試すことができます:

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

この関数を試してください:QWindowsNativeInterface::nativeResourceForWindow

1
Filippok