Qt界面中嵌入其他exe程序的界面,使用Qt5

下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示。本文参考了

http://blog.csdn.net/jiaoyaziyang/article/details/49802993,感谢原作者。

 

 

 

下面是具体的实现方法,用Windows自带的计算器程序做例子。主要的思路就是获取到计算器程序的窗口类名称,然后在Qt中利用QWindow的静态函数fromWinId,创建出QWindow对象,然后将这个对象放到一个QWidget中。

 

首先是获取计算器程序的窗口类名称,主要利用的是VS中的Spy++工具,在VS菜单“工具”中,打开之后如下图所示

 

然后Ctr+F,进行搜索,出现如下界面

确定之后可以获取到类名

 

 完整的代码如下所示,这段代码是放在了一个QMainWindow的构造函数中,首先是调用了windows的API创建了计算器程序的进程,然后思路同前面所述。

 

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

  

 

posted @   gaoxudong0704  阅读(24815)  评论(3编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示