1. 程式人生 > >外部進程嵌入到Qt進程界面(使用QWindow::fromWinId)

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

get 圖片 idt 一個 ram sna create cpp type

有時候需要做框架集成的東西,需要把其他客戶端像組件一樣集成到一個客戶端中,類似於一個軟件集成的平臺客戶端,統一用一個中心管理的客戶端做類似於控制面板一樣的東西去調用不同的軟件。此時就必須相應不同的點擊圖標的事件去嵌入到主界面裏面。下面簡單的對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

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