外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)

有时候需要做框架集成的东西,需要把其他客户端像组件一样集成到一个客户端中,类似于一个软件集成的平台客户端,统一用一个中心管理的客户端做类似于控制面板一样的东西去调用不同的软件。此时就必须相应不同的点击图标的事件去嵌入到主界面里面。下面简单的对windows平台上面Qt的界面中嵌入系统自带的计算机程序做简单的说明。

一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜单“工具”中打开之后如图所示。查找计算器的窗口句柄并获取到具体的类名。

CTRL+F,搜索句柄,获取到对应的类名。

二、通过windows系统函数获取软件进程窗口的句柄。

[cpp] view plain copy

  1. #include<Windows.h>
  2. WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");

接口中的第一个参数是类名称,也就是界面中“类”中有个标题,第二个参数是窗口名称,打开“常规”,填写标题,这个软件窗口名称为“计算器”,填入参数即可。

三、获取QWindow。

QWindow*m_window;

m_window= QWindow::fromWinId(wid);

m_window->setFlags(m_window->flags()|Qt::CustomizeWindowHint|Qt::WindowTitleHint); //这边可以设置一下属性

四、获取代理QWidget。

m_widget = QWidget::createWindowContainer(m_window, this->ui->widget); //第二个参数是作为window的父类,也可以用layout

具体的代码如下所示,代码放在了一个widget的构造函数中。

winId.h

[cpp] view plain copy

  1. #pragma once
  2. #include <QtWidgets/QWidget>
  3. #include "ui_winId.h"
  4. class winId : public QWidget
  5. {
  6. Q_OBJECT
  7. public:
  8. winId(QWidget *parent = Q_NULLPTR);
  9. ~winId();
  10. private:
  11. Ui::winIdClass *ui;
  12. };

winId.cpp

[cpp] view plain copy

  1. #include "stdafx.h"
  2. #include "winId.h"
  3. winId::winId(QWidget *parent)
  4. : QWidget(parent),ui(new Ui::winIdClass)
  5. {
  6. ui->setupUi(this);
  7. //创建进程
  8. //QString cmd="C:/Program Files/R/R-3.3.1/bin/x64/Rgui.exe";
  9. QString cmd = "C:/Windows/system32/calc.exe";
  10. STARTUPINFO si = { sizeof(si) };
  11. PROCESS_INFORMATION pi;
  12. si.dwFlags = STARTF_USESHOWWINDOW;
  13. si.wShowWindow = true;
  14. bool bRet = CreateProcess(
  15. NULL,
  16. (LPWSTR)cmd.toStdWString().c_str(),
  17. NULL,
  18. NULL,
  19. FALSE,
  20. CREATE_NEW_CONSOLE,
  21. NULL,
  22. NULL, &si, &pi);
  23. Sleep(5000);
  24. WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");
  25. //WId wid = (WId)FindWindow(L"Rgui Workspace",NULL);
  26. QWindow *m_window;
  27. m_window = QWindow::fromWinId(wid);
  28. m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //
  29. QWidget *m_widget;
  30. m_widget = QWidget::createWindowContainer(m_window, this->ui->widget);
  31. m_widget->setMinimumSize(400, 300);
  32. }
  33. winId::~winId()
  34. {
  35. delete ui;
  36. }

最后的运行效果如下图。

另外在git上面也有一个例子,具体路径为:https://github.com/snasoft/qt-windows-composition-example

http://blog.csdn.net/u013394556/article/details/78534833

时间: 2024-10-13 20:29:57

外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)的相关文章

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完 已知的坑 1.因为启动的exe进程并非游戏进程,所以通过QProcess的状态来判断Ue4是否启动是不对的,推荐使用WINAPI来获取对应线程. 2.可以在项目设置中修改窗口显示标题,可以把讨厌的(32-bit, PCD3D_SM5)去掉,强烈推荐使用窗口句柄查看工具,我是网上下了句柄精灵.(窗口标题后面都是有空格的) 嵌入Qt后,UE4无法接受键盘鼠标输入 使用 以下函数

windowsf进程管理器中进程解释

(1)[system Idle Process] 进程文件: [system process] or [system process] 进程名称: Windows内存处理系统进程 描 述: Windows页面内存管理进程,拥有0级优先. 介 绍:该进程作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间.它的cpu占用率越大表示可供分配的CPU资源越多,数字越小则表示CPU资源紧张. (2)[alg.exe] 进程文件: alg or alg.exe 进程名称: 应用层网关

linux下的守护进程及会话、进程组

守护进程.会话.进程组网上有许多不错的资料.我也是网上搜罗了一堆,加上自己的理解.不敢说原创,只是写在这怕自己忘记罢了.才疏学浅,难免有错误,欢迎大家指正.下面这篇写很不错,大家可以去看看:http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html.下面的部分内容引用了他的描述. 进程组:进程组就是把一个或多个进程划为一组,给这个组分配一个组id(pgid),这个id通常是进程组组长(该组的第一个进程)的pid.如果进程组组长退

(七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系

linux -- 进程的查看、进程id的获取、进程的杀死

进程查看 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 ps ax|less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps ax|grep XXX(XXX为进程名称) 获取进程id shell获取进程ID的方法: ps -A |grep "cmdname"| awk '{print $1}' pidof "cmdname" pgrep "cmdname" 这三种在bash和

Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的创建 前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) * idle进程由系统自动创建, 运行在内核态 idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_t

Linux进程学习(孤儿进程和守护进程)

孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为 init 进程的子进程.2.那么如何让一个进程变为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程.pid =  fork();if(pid > 0) {         

基于toyix的进程和轻权进程的学习

我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作.大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程,这样就可以关闭卡死的程序,所以我们知道进程就是程序执行所产生的,但是我们对进程没有很清楚的认识.什么是进程?进程在程序的执行过程中到底起了什么样的作用?我们在toyix平台上来对进程进行研究学习. 一.什么是toyix? Toyix是王爽老师为了进行操作系统基础理论教学而开发的一个系统.它的特点是