WPF嵌入外部exe应用程序-使用Winfom控件承载外部程序

使用Winform控件承载外部程序

  • 在WPF中使用Winfom控件
    • 添加winform相关的程序集
    • 在XAML头中加入对这两个程序集命名空间的引用
    • 使用Winform控件
    • 效果:
    • 问题
  • 在Winfom控件中嵌入exe程序
    • 准备Winfrom控件
    • 更换父窗体的句柄
    • 完整实现代码:
    • 实现效果:
  • 问题和后续更新

在WPF中使用Winfom控件

首先要解决在WPF中如何使用Winfom控件的问题,官方对此有支持的方式。

添加winform相关的程序集

在引用管理器中添加winfrom相关的程序集System.Windows.FormsWindowsFormsIntegration

在这里插入图片描述

在XAML头中加入对这两个程序集命名空间的引用

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

使用Winform控件

然后使用winform的控件,得在外面套一层WindowsFormsHost(好像添加了WindowsFormsIntegration,不使用wfi:也能使用)

<wfi:WindowsFormsHost Margin="0,0,400,73"><wf:TextBox />
</wfi:WindowsFormsHost>

在这里插入图片描述

效果:

这样就可以在WPF中使用Winform控件,但是不推荐,除非特殊情况。

在这里插入图片描述

问题

这种方式存在的问题:

  • WindowsFormsHost依旧是显示在最前,暂时没找到解决方法,尽量从设计上避免

  • 后台无法获取到WindowsFormsHost内部控件的名称,只能通过WindowsFormsHost获取内部控件的句柄。

在Winfom控件中嵌入exe程序

准备Winfrom控件

WindowsFormsHost中控件换成Panel

<wfi:WindowsFormsHost Name="WFHost" Margin="0,0,400,73"><wf:Panel  />
</wfi:WindowsFormsHost>

更换父窗体的句柄

将获取主窗体句柄换成获取Panel句柄,然后设置窗体大小跟WindowsFormsHost控件一样

   //当前窗体/容器(主程序)句柄IntPtr hwnd = WFHost.Child.Handle;//设置窗体位置和大小MoveWindow(appWin, 0, 0, (int)WFHost.ActualWidth, (int)WFHost.ActualHeight, true);

完整实现代码:

上述功能完整实现的代码如下
可以更新到上一篇的MainWindow的代码中去。

           var exeName = "C:\\WINDOWS\\system32\\mspaint";//使用Process运行程序Process p = new Process();p.StartInfo.FileName = exeName;p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;p.Start();//获取窗体句柄while (p.MainWindowHandle.ToInt32() == 0){System.Threading.Thread.Sleep(100);}IntPtr appWin = p.MainWindowHandle;//子窗体(外部程序)句柄//当前窗体/容器(主程序)句柄IntPtr hwnd = WFHost.Child.Handle;//设置父窗体(实现窗体嵌入)SetParent(appWin, hwnd);//设置窗体样式var style = GetWindowLong(appWin, GWL_STYLE);SetWindowLong(appWin, GWL_STYLE, style & ~WS_CAPTION & ~WS_THICKFRAME);//设置窗体位置和大小MoveWindow(appWin, 0, 0, (int)WFHost.ActualWidth, (int)WFHost.ActualHeight, true);

实现效果:

在这里插入图片描述

搞个Grid分多行和列,进行拖动操作,可以看到子窗体显示区域限制在WindowsFormsHost 内部了,拖动变化子窗体不会超出显示区域。

效果

问题和后续更新

子窗体实现大小还是固定的,没有随着控件变化实时调整,需要窗体或者控件调整大小重绘时,使用MoveWindow刷新,以达到子窗体尺寸跟随控件尺寸的大小,实现更好的嵌入。

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

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

相关文章

ffmpeg get_bits() 函数是如何工作的.

/* * 本测试程序用来说明 GetBitContext 是什么? * get_bits() 函数是如何工作的. * author: hjjdebug * date: 2023年 07月 13日 星期四 16:42:45 CST */ GetBitContext 是如下定义的, 没有什么特别之处,指明了数据指针buffer,size_in_bits. typedef struct GetBi…

perl输出中文乱码【win10】

perl输出中文乱码 运行的时候输出的内容变成了中文乱码&#xff0c;原因首先来查找一下自己的perl的模块里面是否有Encode-CN。请运行打开你的cmd并输入perldoc -l Encode::CN 如果出现了地址 则就是有&#xff0c;如果没有需要进行该模块的安装。 安装方式有很多种&#xff0…

MetaTown:一个可以自己构建数字资产的平台

摘要&#xff1a;华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案。 本文分享自华为云社区《基于MetaTown构建数字资产平台》&#xff0c;作者&#xff1a; 阿米托福。 华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案&…

“掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

快速排序是一种基于分治思想的排序算法&#xff0c;它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此&#xff0c;快速排序还具有简洁的实现代码和良好的可扩展性&#xff0c;成为最受欢迎的排序算法之一。接下来&#xff0c;让我带你了解一下它的魅力吧&…

Linux系统部署Nginx详细教程(图文讲解)

前言&#xff1a;本篇博客记录了我是如何使用Linux系统一步一步部署Nginx的完整过程&#xff0c;也是我学习之路上的一个笔记总结&#xff0c;每一行代码都进行了严格的测试&#xff0c;特此做一个技术分享&#xff01; 目录 一、安装依赖 二、安装Nginx 三、配置Nginx 四、…

visio 图片转换到 latex 中

调整图片大小 在Visio中&#xff0c;设计–>页面设置–>大小–>适应绘图&#xff0c;这样会自动去除多余空白&#xff0c;保留部分空白作为边界&#xff0c;无需使用Word。 2. 将新的Visio文件另存为pdf格式文件 3. latex 中插入pdf 格式图片

手把手教你搭建SpringCloud项目(八)集成Ribbon负载均衡器

什么是微服务&#xff1f;一看就会系列&#xff01; 一、手把手教你搭建SpringCloud项目&#xff08;一&#xff09;图文详解&#xff0c;傻瓜式操作 二、手把手教你搭建SpringCloud项目&#xff08;二&#xff09;生产者与消费者 三、手把手教你搭建SpringCloud项目&#x…

【数据结构】24王道考研笔记——图

六、图 目录 六、图定义及基本术语图的定义有向图以及无向图简单图以及多重图度顶点-顶点间关系连通图、强连通图子图连通分量强连通分量生成树生成森林边的权、带权网/图特殊形态的图 图的存储及基本操作邻接矩阵邻接表法十字链表邻接多重表分析对比图的基本操作 图的遍历广度…

区块链学习一:安装 Geth

区块链技术正在迅速发展&#xff0c;并在各个领域展现出巨大的潜力。如果您对区块链开发感兴趣&#xff0c;那么学习如何安装和配置以太坊客户端 Geth 是一个很好的起点。在本篇文章中&#xff0c;我们将介绍如何使用 DockerHub 上的 Geth Docker 映像来快速安装和运行 Geth 节…

vue学习笔记(一)

1.编辑器选择 是用vscode 和 webstrom 个人感觉 vscode的插件比较多&#xff0c;对vue3的支持比较好 webstorm的自动保存比较好 各有优劣吧 我学习的这个项目目前采用vscode 2.vue2 还是 vue3 框架学通了都是通用的&#xff0c;这个时间点来学肯定是学vue3 只是顾虑到团…

JavaScript XHR、Fetch

1 前端数据请求方式 2 Http协议的解析 3 XHR的基本用法 4 XHR的进阶和封装 5 Fetch的使用详解 6 前端文件上传流程 早期的页面都是后端做好&#xff0c;浏览器直接拿到页面展示的&#xff0c;用到的是jsp、asp、php等等的语言。 这个叫做服务器端渲染SSR。 这里后端向前端…

金融数据库的战场,太平洋保险和OceanBase打了场胜仗

点击关注 文丨刘雨琦 “数据库的国产替代&#xff0c;必须经过严格的考虑&#xff0c;保证不会出错&#xff0c;所以大多数企业的领导层选择按兵不动或者简单扩容。因为不换就不会错&#xff0c;选了很久如果选错&#xff0c;还可能会出现重大事故。” 某银行数据库技术人员…

Go语言之函数补充defer语句,递归函数,章节练习

defer语句是go语言提供的一种用于注册延迟调用的机制&#xff0c;是go语言中一种很有用的特性。 defer语句注册了一个函数调用&#xff0c;这个调用会延迟到defer语句所在的函数执行完毕后执行&#xff0c;所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句…

语音识别开源框架 openAI-whisper

Whisper 是一种通用的语音识别模型。 它是OpenAI于2022年9月份开源的在各种音频的大型数据集上训练的语音识别模型&#xff0c;也是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。 GitHub - yeyupiaoling/Whisper-Finetune: 微调Whisper语音识别模型和加速推理…

数据结构问答3

1. 栈、队列、线性表的区别与联系(异同) 答: 栈和队列联系:逻辑结构都是线性结构;存储结构都可以采用顺序存储结构和链式存储结构;他们的数据元素都呈线性关系,是一种的线性表,且只允许在端点处插入和删除元素 栈、队列和线性表联系:栈和队列都是一种操作受限的线性…

netty组件详解-上

netty服务端示例: private void doStart() throws InterruptedException {System.out.println("netty服务已启动");// 线程组EventLoopGroup group new NioEventLoopGroup();try {// 创建服务器端引导类ServerBootstrap server new ServerBootstrap();// 初始化服…

【嵌入式开发 Linux 常用命令系列 6 -- 字符提取 cut 命令使用】

文章目录 Cut 命令和语法指定分隔符以字符的方式提取内容根据字节提取字符 上篇文章&#xff1a;嵌入式开发 Linux 常用命令系列 5 – history 与 “&#xff01;“ 巧妙配合 Cut 命令和语法 cut 命令的基本语法如下&#xff1a; $ cut OPTION... [FILE]...cut 的一些选项如…

苹果APP安装包ipa如何安装在手机上

苹果APP安装包ipa如何安装在手机上 苹果APP的安装比安卓复杂且困难&#xff0c;很多人不知道如何将ipa文件安装到手机上。以下是几种苹果APP安装在iOS设备的方式&#xff0c;供大家参考。 一、上架App Store 这是最正规的方式。虽然审核过程复杂、时间较长&#xff0c;且审核…

数据可视化组件有什么用?

数据可视化组件在数据分析中扮演着至关重要&角色。 通过图表、图形和交互式界面&#xff0c;数据可视化组件帮助将复杂的数据转化为易于理解的视觉展示。这种形式的数据呈现有助于发现模式、趋势和异常&#xff0c;并能够快速有效地传达数据的含义和洞察。 下面简单举两个…

不使用插件预览pdf等类型文件

前端使用window.open即可 var url"file/preview.do?path"response.path"&fileName"response.name; top.window.open(url,response.name,"_blank"); 接口代码如下 RequestMapping(value "/file/preview.do")public ResponseBod…