当前位置: 首页 > article >正文

QWidget(c++)嵌入window环境的exe

QWidget(c++)嵌入window环境的exe

我用的msvc2017 64bit编译器会报这个错误

visual.obj:-1: error: LNK2019: __imp_FindWindowW "public: __cdecl Visual::Visual(class QWidget *)" (??0Visual@@QEAA@PEAVQWidget@@@Z)

然后改成minGw 64bit 就不会报错

#ifndef VISUAL_H
#define VISUAL_H

#include <QWidget>
#include <QProcess>
#include<Windows.h>
#include<QWindow>

#include <Windows.h>
#include <iostream>
#include <WinUser.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Visual; }
QT_END_NAMESPACE

class Visual : public QWidget
{
    Q_OBJECT

public:
    Visual(QWidget *parent = nullptr);
    ~Visual();


private:
    Ui::Visual *ui;
    QProcess *process;
    QWindow * m_window;
};
#endif // VISUAL_H

#include "visual.h"
#include "ui_visual.h"

#include <Windows.h>
#include <iostream>
#include <WinUser.h>

Visual::Visual(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Visual)
{
    ui->setupUi(this);
    process = new QProcess(this);
	//必须先启动exe,才能获取到它的句柄
    QString cmd ="C:/Program Files/Tencent/WeChat/WeChat.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);

//延时是为了保证exe程序充足启动时间,才能获取句柄
    Sleep(1000);

	//窗口的类名和窗口的标题。要专门用spy工具去获取,下面有图
    QString className = "WeChatLoginWndForPC"; // 记事本窗口的类名
    QString windowName = "微信"; // 记事本窗口的标题

      // 查找窗口句柄
        WId wid = (WId)FindWindow((LPCWSTR)className.unicode(), (LPCWSTR)windowName.unicode());

//      if (wid == 0) {
//          std::cerr << "未找到窗口!" << std::endl;
//          return ;
//      }

    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(800, 800);

    ui->widget->layout()->addWidget(m_widget);
}

Visual::~Visual()
{
    delete ui;
}

我这里使用vs的spy工具,获取窗口的 标题和类名
在这里插入图片描述

最后是这种效果

在这里插入图片描述


http://www.kler.cn/a/298830.html

相关文章:

  • 基于kraft部署kafka集群
  • 预览和下载 (pc和微信小程序)
  • 微调大模型时,如何进行数据预处理? 将<input, output>转换为模型所需的<input_ids, labels, attention_mask>
  • 计算机基础知识复习12.24
  • C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容
  • 算法day_3数组中的单一元素和二进制位颠倒
  • class 7: vue.js 3 前端工程化
  • 面向 AI 学习者的 Python 快速入门(初学者)
  • 经纬恒润高压电池管理系统,助力新能源汽车飞速发展
  • [Linux]:文件(下)
  • 韩国裸机云站群服务器的特点和使用步骤
  • 如何通过技术手段提高对网络赌博资金流向的监测效率?
  • Linux业务系统将/home目录删除并将空间扩给根目录
  • 简要介绍联合索引
  • SprinBoot+Vue校园部门资料管理系统的设计与实现
  • Git操作和提交规范
  • 【算法专题--回文】最长回文子串 -- 高频面试题(图文详解,小白一看就懂!!)
  • 云曦2024秋季开学考
  • TeamTalk数据库代理服务器
  • SprinBoot+Vue智慧农业专家远程指导系统的设计与实现
  • 【自用21.】C++-this指针
  • pyflink的窗口
  • 5G网络建设
  • 【Kubernetes】常见面试题汇总(五)
  • Linux之ansible的playbook剧本(yaml文件)
  • 力扣题解2552