实现步骤
第一步 获取进程的句柄
通过Windows API获取窗口句柄。
代码如下:文章来源地址https://www.toymoban.com/news/detail-531128.html
// 定义枚举回调函数
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;
}
}
}
}
}
文章来源:https://www.toymoban.com/news/detail-531128.html
到了这里,关于QT---将第三方软件窗口嵌入窗口中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!