QT---将第三方软件窗口嵌入窗口中

实现步骤

第一步 获取进程的句柄

通过Windows API获取窗口句柄。
代码如下:

// 定义枚举回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	if (!IsWindowVisible(hwnd))
	{
		return TRUE;
	}
	std::vector<wstring>& titles = *reinterpret_cast<std::vector<wstring>*>(lParam);
	wchar_t titleBuf[512];
	if (GetWindowText(hwnd, titleBuf, _countof(titleBuf)) > 0)
	{
		auto pTitles = reinterpret_cast<vector<wstring>*>(lParam);
		pTitles->push_back(titleBuf);
	}
	return TRUE;  // 继续枚举下一个窗口
}
// 执行枚举
vector<wstring> windowTitles;
::EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&windowTitles));

第二步 使用QProcess打开第三方exe

  QProcess*p = = new QProcess();
	{
		p->start(path);
		// 获取外部进程的PID
		qint64 externalProcessId = p->processId();
		Sleep(5000);//等待进行加载完成
		vector<wstring> windowTitles;
		::EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&windowTitles));
		for(wstring  title : windowTitles)
		{
			HWND hwnd = ::FindWindow(nullptr,(LPCWSTR)title.c_str());
			if (hwnd != nullptr)
			{
				DWORD processId;
				::GetWindowThreadProcessId(hwnd, &processId);
				if (processId == externalProcessId)
				{
					WId wid = (WId)hwnd;
					m_pQWindow = QWindow::fromWinId(wid);
					QWidget *pWindow = QWidget::createWindowContainer(m_pQWindow);
					pWindow->setWindowModality(Qt::NonModal);
					pWindow->setAttribute(Qt::WA_ShowModal, false);
					pWindow->setWindowFlags(Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint);
					pWindow->setFixedWidth(1200);
					pWindow->setFixedHeight(800);
					pWindow->show();
					return;
				}
			}
		}	
	}
}

你可能感兴趣的:(QT,qt,开发语言)