在Qt中将QWindow或者QWidget嵌入到别的进程中的窗口中(windows)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/r5014/article/details/79286444

前提:必须知道另外一个进程的窗口句柄


示例(这里用QWidget距离,QWindow也一样的):

1、首先创建一个进程,创建一个顶级窗口“Proc 1 Window”并运行

#include "mainwindow.h"
#include <QApplication>

#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowTitle("Proc 1 Window");
    w.show();

    qDebug() << "proc 1 window handle:" << w.winId();

    return a.exec();
}

运行效果:

运行结果




记住Proc 1 Window 的HWND 为‘132510’!

扫描二维码关注公众号,回复: 3346658 查看本文章


2、创建第二个进程,创建它的顶级窗口“Proc 2 Window”并运行(记住其中使用的句柄为Proc 1 Window的句柄)

#include "mainwindow.h"
#include <QApplication>
#include <QLabel>
#include <QWindow>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.setStyleSheet("background-color: lightblue;");
    //TODO: add a mark label
    QLabel text("Proc 2 Window",&w);
    text.setStyleSheet("background-color: pink; color: naviy;");

    WId proc2Window_HWND = WId(132510);
    //TODO: create the proc 1 window delegate
    QWindow* proc1Widow = QWindow::fromWinId(proc2Window_HWND);

    //TODO: set the proxy widnow handle to proc 2 window
    w.setProperty("_q_embedded_native_parent_handle",QVariant(proc2Window_HWND));

    //TODO: set the proxy window to proc2 window for parent
    w.winId();
    w.windowHandle()->setParent(proc1Widow);
    w.resize(250,250);
    w.move(20,20);

    w.show();

    return a.exec();
}

运行结果:



这时候你会看到Proc 2 运行之后没有出现新的顶级窗口,那么怎么办?别急,这时候你打开Proc 1 Window,你就会看到Proc 2 Window 已经嵌入到了Proc 1 Window! 以下为结果图:



其中亮蓝色部分就为Proc 2 Window!


至此就完成了Windows下Qt中将窗口潜入到其他进程窗口的示例!


——

注:这个方式是我刨Qt源码得出的方式,可能会根据不同的Qt版本有所差异。

(未经同意请勿转载!)












猜你喜欢

转载自blog.csdn.net/r5014/article/details/79286444