如何在Windows 10中获得QDialog的HWND

how to get HWND for QDialog in Windows 10

本文关键字:QDialog HWND Windows      更新时间:2023-10-16

我正试图读取对话框的HWND,我从QDialog子类化,但我(认为我)正在运行一个导致空指针返回到客户端代码的Memory Access Error

头文件-我已经放弃尝试得到一个HWND,因为我甚至不能得到一个WId…

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    WId getWindowHandle (void);
private:
    Ui::Dialog *ui;
    QGraphicsScene *scene;
    QGraphicsTextItem *text;
};
#endif // DIALOG_H
实现:

WId Dialog::getWindowHandle() {
    WId id = this->effectiveWinId(); // debugger says id = 0
    return id;
}

我也试过这个:

WId Dialog::getWindowHandle() {
    QWidget *parent = this->nativeParentWidget(); // debugger says parent = 0
    WId id = parent->effectiveWinId(); // so this crashes
    return id;
}

我是Qt的新手,希望有一些明显的我错过了。

获得QDialog的WId的规范方法是什么?

工具链:Windows 10周年纪念,Qt 5.7,都是64位,Visual Studio 14 c++编译器,Windows SDK调试器

希望这对你有帮助。

在Qt 4.4中引入,外来小部件是窗口系统不知道的小部件。它们没有与之关联的本机窗口句柄。此功能显著加快了小部件的绘制、调整大小和消除闪烁。

如果您需要本机窗口的旧行为,您可以选择以下选项之一:

1在您的环境中使用QT_USE_NATIVE_WINDOWS=1。

2在应用程序上设置Qt::AA_NativeWindows属性。所有Widgets将是原生的Widgets。

3在widgets上设置Qt::WA_NativeWindow属性:widget本身所有的祖先都将成为本地的(除非Qt::WA_DontCreateNativeAncestors设置).

4调用QWidget::winId来强制使用本机窗口(这意味着3)。

5设置Qt::WA_PaintOnScreen属性以强制使用本机窗口(这意味着3).

参考QT文档http://doc.qt.io/qt - 4.8 -/- qwidget.html # effectiveWinId

Dmitry的评论(上面)有一个适合我的答案:

this->window()->winId()

返回非空uint64。

谢谢,德米特里•!