C#Winform窗体中嵌入exe文件

news2024/9/20 12:39:21

1,效果以嵌入Modbus Slave为例:

2,代码:

 public partial class Form1 : Form
    {
        //设置嵌入exe的常量
        private const int nIndex = -16;
        private const int dwNewLong = 0x10000000;
        Process m_AppProcess;
        public Form1()
        {
            InitializeComponent();
            btnApp.Enabled = false;
        }
        private void btnAppFilePath_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                ofd.Filter = "可执行文件*.exe|*.exe";
                ofd.Multiselect = false;
                ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    lblExeFilePath.Text = ofd.FileName;
                    btnApp.Enabled = true;
                }
            }
        }
        private void btnApp_Click(object sender, EventArgs e)
        {
            if (lblExeFilePath.Text.Trim().Length == 0)
            {
                MessageBox.Show("请先选择需要执行的exe文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            int num = panel1.Controls.Count;
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = lblExeFilePath.Text.Trim();
            info.UseShellExecute = false;
            info.CreateNoWindow = false;
            info.WindowStyle = ProcessWindowStyle.Minimized;
            m_AppProcess = Process.Start(info);
            if (m_AppProcess.WaitForInputIdle(-1))
            {
                System.Threading.Thread.Sleep(500);
                if (EmbedProcess( panel1))
                {
                    return;
                }
            }
            MessageBox.Show("启动失败!");
        }
        /// <summary>
        /// 将指定路径的Exe文件嵌入到指定的窗口容器中
        /// </summary>
        /// <param name="processPath">进程路径</param>
        /// <param name="sleepTime">等待启动时间,单位ms</param>
        /// <param name="parentControl">父容器</param>
        /// <returns></returns>
        bool EmbedProcess( Control parentControl)
        {
            //等待应用启动
            //   EmbedProcess(path, 1000, panel1);
            // System.Threading.Thread.Sleep(sleepTime);
            //  Environment.Is64BitOperatingSystem
            //获取该进程的句柄
            try
            {
                SetParent(m_AppProcess.MainWindowHandle, parentControl.Handle);
                //去除边框
                //判断系统位数
                if (IntPtr.Size == 4)
                {
                    //32位系统
                    SetWindowLongPtr32(new HandleRef(this, m_AppProcess.MainWindowHandle), nIndex, dwNewLong);
                }
                else
                {
                    //64位系统
                    SetWindowLongPtr64(new HandleRef(this, m_AppProcess.MainWindowHandle), nIndex, dwNewLong);
                }
                //移动窗体
                MoveWindow(m_AppProcess.MainWindowHandle, 0, 0, parentControl.Width, parentControl.Height, true);
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }
        //将子窗体嵌入到父窗体,可用于在窗体中嵌入Exe文件
        [DllImport("user32.dll", SetLastError = true)]
        static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
        //32位系统使用,作用去除边框
        [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
        static extern IntPtr SetWindowLongPtr32(HandleRef hWnd, int nIndex, int dwNewLong);
        //64位系统使用,作用去除边框
        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
        static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, int dwNewLong);
        //移动窗体
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解AsyncRotationController

概述 基于android 15.0, 以从强制横屏App上滑退回桌面流程来分析 frameworks/base/services/core/java/com/android/server/wm/AsyncRotationController.javaAsyncRotationController 是一种控制器&#xff0c;用于处理设备显示屏旋转时非活动窗口的异步更新。这种控制器通过…

【记录】CSS|Tailwind 的主题定义的颜色的使用方法(--color啥的)

文章目录 【记录】CSS&#xff5c;Tailwind 的主题定义的颜色的使用方法&#xff08;--color 啥的&#xff09;省流版GPT 详细解释版Tailwind CSS 配置文件示例使用自定义颜色定义 CSS 变量总结 附赠个 Tips 【记录】CSS&#xff5c;Tailwind 的主题定义的颜色的使用方法&#…

【Python】已解决:ModuleNotFoundError: No module named ‘sklearn.cross_validation

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 &#xff08;机器学习分割数据问题&#xff09;解决“ModuleNotFoundError: No module named ‘sklearn.cross_validation’” 一、问题背景 在机器学习的实践中&#xff0c;数据分割是…

聚鼎装饰画:现在做装饰画能不能相信

在艺术的殿堂中&#xff0c;装饰画以其多变的风格和独特的魅力占据了一席之地。它们或清新淡雅&#xff0c;或浓烈奔放&#xff0c;总能为现代家居带来一丝生气与美感。然而&#xff0c;在这美丽的背后&#xff0c;却隐藏着一个令人困惑的问题&#xff1a;现在做装饰画&#xf…

[EasilyOpenJCL] 使用 Java 调用显卡 计算 和Java调用 CPU 进行计算 的基准测试!

设备环境介绍 easily-openJCL 是一个轻量级的 Java 语言下的 GPU 显卡 计算库&#xff0c;它提供了一套简单易用的 API&#xff0c;让用户能够轻松实现 GPU 计算操作。 通过 Java 调用 GPU 计算的一个库&#xff0c;使用非常简单的API就可以轻松应付 Java 数据类型在 GPU 中的…

程序使用多进程,打包.exe后,程序陷入死循环

最近写了一个深度学习程序&#xff0c;用cxfreezee打包exe后&#xff0c;在本地运行突然出现死循环&#xff0c;明明在pycharm运行一切正常。 排查了问题&#xff0c;怀疑是多进程的原因&#xff0c;解决办法&#xff1a; 在你的主程序前添加一行代码&#xff1a; if __name_…

Typescript 模块小知识-global scope

问题表现 在编写ts代码的时候遇到一个问题, 表现为, 如果在某个ts工程中, 如果多个文件里面没有任何导出export或者是export default, 那么这些文件如果有const或者是let定义相同的声明都会报错如下 无法重新声明块范围变量 a/a.ts 和 index.ts 和 index2.ts 都没有进行expor…

C++系列-Vector(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Vector的介绍及使用 Vector的介绍 当vector构建的参数类型为char类型时&#xff0c;它是和string是极其类似的&#xff0c;但是二者之间也有不同&#xff0c;比如&#xff0c…

人工智能时代,零基础学IT,我首推Python作为你编程入门语言!

人工智能时代为什么将 Python 称为第一语言&#xff1f; 因为python适应了人工智能时代&#xff1a; 人工智能时代对于代码的简便性有很大要求&#xff0c;像传统的C/CPP/Java学习较为复杂&#xff0c;学习路线长&#xff0c;对于很多零基础的人入门困难。python的兼容性&…

24下软考高级-系统架构设计师100条知识点速记!

11月系统架构设计师现在准备真的太早了吗&#xff1f; 不不不~对于0基础和打工人&#xff0c;留给我们备考的时间其实已经不多了&#xff01; 想开始不晓得从哪里开始&#xff1f;这里给大家整理了24下系统架构设计师知识点100条&#xff0c;符合最新版教材和考试大纲&#x…

Python实现动态迷宫生成:自动生成迷宫的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义迷宫生成类主循环 完整代码 引言 迷宫生成算法在游戏开发和图形学中有着广泛的应用。它不仅可以用于创建迷宫游戏&#xff0c;还可以用于生成有趣的图案。在这篇博客中&#xff0c;我们将使用Python…

目前哪些充电宝是最强?曝光几款好用的充电宝排行榜

充电宝在我们的日常生活中能为我们带来无与伦比的便捷与体验。然而&#xff0c;当充电宝市场品牌和型号众多&#xff0c;功能丰富多样&#xff0c;口碑最佳的充电宝究竟有哪些&#xff1f;怎样才能挑选到口碑上佳、契合个人需求的充电宝&#xff0c;这已然成为消费者面临的难题…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【HMAC(C/C++)】

HMAC(C/C) HMAC是密钥相关的哈希运算消息认证码&#xff08;Hash-based Message Authentication Code&#xff09;&#xff0c;是一种基于Hash函数和密钥进行消息认证的方法。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 生…

基于Python/MATLAB长时间序列遥感数据处理及在全球变化、植被物候提取、植被变绿与生态系统固碳分析、生物量估算与趋势分析应用

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

大模型【Qwen2-7B本地部署(WEB版)】(windows)

大模型系列文章目录 Qwen2-7B本地部署&#xff08;WEB版&#xff09; 前言 大模型是截止2024年上半年最强的AI&#xff0c;Qwen2是刚出来的号称国内最强开源大模型。这是大模型系列的第一篇文章&#xff0c;旨在快速部署看看最近出来的大模型效果怎么样&#xff0c;效果ok的话…

Nature Communications|柔性无感智能隐形眼镜(柔性传感/可穿戴电子/柔性电子)

南京大学徐飞(Fei Xu)、陆延青(Yanqing Lu)、陈烨(Ye Chen)和江苏省人民医院袁松涛(Songtao Yuan)团队,在《Nature Communications》上发布了一篇题为“Frequency-encoded eye tracking smart contact lens for human–machine interaction”的论文。论文内容如下: 一、 摘…

【Pytorch】Conda环境pack打包迁移报错处理

文章目录 Anaconda虚拟环境打包一、源电脑的环境打包1.安装conda-pack工具2.确定环境3.打包环境4.将打包环境拷贝到U盘 二、环境迁移到目标电脑上三、异常处理pip install -e. 导致无法pack→忽略管理的文件已经被删除或者被覆盖→压缩成tar注意 重新激活环境 Anaconda虚拟环境…

Dify中的知识库API列表

1.知识库API列表 通过文本/文件创建/更新/删除文档/查询文档嵌入状态&#xff0c;知识库创建/知识库查询/文档列表查询&#xff0c;分段增/删/改/查。 接口名字功能描述请求示例POST/datasets/{dataset_id}/document/create_by_text通过文本创建文档此接口基于已存在知识库&a…

法律咨询援助网站

1 项目介绍 1.1 摘要 随着互联网技术的飞速发展&#xff0c;公众对于便捷、高效的法律咨询服务需求日益增长。传统的法律咨询方式已难以满足人们即时性、多样化的咨询需求&#xff0c;促使法律咨询援助网站应运而生。这些平台旨在通过数字化手段&#xff0c;为用户提供法律知…

Python基础教学之二:核心篇——数据结构与流程控制

Python基础教学之二&#xff1a;核心篇——数据结构与流程控制 一、深入理解数据类型 1. 字符串、数字和布尔类型 字符串操作&#xff1a;Python中的字符串可以通过多种内置方法和格式化工具进行操作。例如使用str.format()方法来格式化字符串&#xff0c;或者通过str.join()…