很多示例无法使用后无法实现嵌入,经过反复调试整理完整demo流程
pro文件加载user32库
LIBS += -luser32
1.UI界面添加 horizontalLayout控件
2.设置头文件
#ifndef SHOWCONTROL_H
#define SHOWCONTROL_H
#include <QMainWindow>
#include <QProcess>
#include <QVBoxLayout>
#include <qsettings.h>
#include <QSplitter>
#include <QTextEdit>
#include <QApplication>
#include <QWindow>
#include <QPropertyAnimation>
#include "ui_showcontrol.h"
#include "stdio.h"
#include "Windows.h"
#include <TlHelp32.h>
//QT_BEGIN_NAMESPACE
//namespace Ui { class ShowControl; }
//QT_END_NAMESPACE 注释掉原方法
class ShowControl : public QMainWindow
{
Q_OBJECT
public:
ShowControl(QWidget *parent = nullptr);
~ShowControl();
private slots:
void on_pushButton_clicked();
void on_pushButton_3_clicked();
public:
QVBoxLayout *layout;
bool sideFlag;
public:
void ShowAppControl();
private:
QPropertyAnimation * property;
QPropertyAnimation * property2;
QPropertyAnimation * property3;
int width;
int height;
//Ui::ShowControl *ui;
Ui::ShowControl ui;//创建UI对象
};
#endif // SHOWCONTROL_H
2. ShowControl.cpp
ShowControl::ShowControl(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
sideFlag = true;
ui.widget->setAttribute(Qt::WA_Hover,true);
property = new QPropertyAnimation(ui.widget,"geometry");
property->setEasingCurve(QEasingCurve::InOutSine);
property->setDuration(200);
property3 = new QPropertyAnimation(ui.pushButton_3,"geometry");
property3->setEasingCurve(QEasingCurve::InOutSine);
property3->setDuration(200);
}
ShowControl::~ShowControl()
{
}
struct handle_data {
unsigned long process_id;
HWND best_handle;
};
BOOL IsMainWindow(HWND handle)
{
return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
{
handle_data& data = *(handle_data*)lParam;
unsigned long process_id = 0;
GetWindowThreadProcessId(handle, &process_id);
if (data.process_id != process_id || !IsMainWindow(handle)) {
return TRUE;
}
data.best_handle = handle;
return FALSE;
}
HWND FindMainWindow(unsigned long process_id)
{
handle_data data;
data.process_id = process_id;
data.best_handle = 0;
BOOL ii = EnumWindows(EnumWindowsCallback, (LPARAM)&data);
return data.best_handle;
}
void ShowControl::ShowAppControl()
{
QString cmd ="D:/Notepad++/notepad++.exe";
QProcess *pro = new QProcess(this);
pro->setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments* args) {
args->startupInfo->wShowWindow = SW_HIDE;
args->startupInfo->dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
});
pro->start(cmd,QStringList());
pro->waitForStarted();
qint64 id = pro->processId();
HWND mainwindowHwnd = nullptr;
while (1)
{
mainwindowHwnd = FindMainWindow(id);
if (mainwindowHwnd)
break;
}
QWindow* m_window = QWindow::fromWinId((WId)mainwindowHwnd);
m_window->setFlags(m_window->flags()|Qt::CustomizeWindowHint|Qt::WindowTitleHint);
QWidget* m_widget;
m_widget = QWidget::createWindowContainer(m_window,this);
m_widget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
m_widget->adjustSize();
ui.horizontalLayout->addWidget(m_widget);
}
void ShowControl::on_pushButton_clicked()
{
ShowAppControl();
}
3.运行结果
单纯显示实现,具体还需要自己添加析构方法。