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

这篇具有很好参考价值的文章主要介绍了WPF嵌入外部exe应用程序-使用Winfom控件承载外部程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在WPF中使用Winfom控件

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

添加winform相关的程序集

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

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

在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嵌入外部exe应用程序-使用Winfom控件承载外部程序,WPF,wpf

效果:

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

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

问题

这种方式存在的问题:

  • 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);

实现效果:

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

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

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

问题和后续更新

子窗体实现大小还是固定的,没有随着控件变化实时调整,需要窗体或者控件调整大小重绘时,使用MoveWindow刷新,以达到子窗体尺寸跟随控件尺寸的大小,实现更好的嵌入。文章来源地址https://www.toymoban.com/news/detail-584073.html

到了这里,关于WPF嵌入外部exe应用程序-使用Winfom控件承载外部程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【自动化】在WPF应用程序中使用MVVM框架实现Modbus协议通信

    Modbus是一种广泛应用于工业领域的通信协议,主要用于设备间的数据交换。在WPF应用程序中,我们可以使用MVVM(Model-View-ViewModel)框架来实现Modbus协议的通信。本文将详细介绍如何实现这一功能。 为了在WPF应用程序中实现Modbus协议通信,我们需要安装一些第三方库。可以使用

    2024年03月22日
    浏览(31)
  • C# WPF应用使用visual studio的安装程序类的一些坑

    否则会出现命名空间System.Configuration不存在Install的报错   var s = Context.Parameters[\\\"assemblypath\\\"].ToString() 这个里面是当前文件的路径,所以需要删除掉文件的名字才能获取目录路径 var dir = s.Substring(0, s.LastIndexOf(\\\"\\\\\\\") + 1)

    2024年02月12日
    浏览(27)
  • 如何签署exe或Windows应用程序?

    本文您将了解为什么要签署Windows应用程序以及如何签署EXE或Windows应用程序的步骤指南。 代码签名是一种确保软件来自经过验证的正版软件发行商的方法。使用代码签名证书唱WindowsEXE文件可确保可执行文件或Windows应用程序不会被恶意行为者更改或修改。 Windows应用程序签名过

    2024年02月09日
    浏览(33)
  • pyinstaller打包exe应用程序详细教程

    1、PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,从而允许最终用户在无需安装 Python 的情况下执行应用程序。 PyInstaller 制作出来的执行文件并不是跨平台的,如果需

    2024年02月11日
    浏览(45)
  • SpringBoot项目如何打包成exe应用程序

    准备工作: 一个jar包,没有bug能正常启动的jar包 exe4j,一个将jar转换成exe的工具 链接: https://pan.baidu.com/s/1m1qA31Z8MEcWWkp9qe8AiA 提取码: f1wt inno setup,一个将依赖和exe一起打成一个安装程序的工具 链接: https://pan.baidu.com/s/1m1qA31Z8MEcWWkp9qe8AiA 提取码: f1wt 以我为例子,我将jar包放在了

    2024年02月04日
    浏览(49)
  • (二)WPF - 应用程序

    (1) Application 对象被构造出来。 (2)Run方法被调用。 (3)Application.Startup 事件被触发 (4)用户代码构造一个或多个 Window 对象。 (5)Application.Shutdow 方法被调用。 (6)Application.Exit 事件被触发。 (7)Run 方法完成执行。 初始化应用程序有两种方法 : 从 Application 对象的

    2024年02月10日
    浏览(31)
  • IDEA打包jar包,以及exe应用程序。

    一、将IDEA中的java项目打包成jar包 ①点击菜单栏中的文件→项目结构 ②在项目结构窗口选择工件。点击添加,选择jar,选择来自有依赖项的模块 ③在【从模块创建JAR】对话框中,选择主类,点击确定 ④点击确定。 ⑤点击菜单栏中的构建,选择构建项目 ⑥点击菜单栏中的构

    2024年02月08日
    浏览(49)
  • selenium-manager.exe应用程序错误解决办法

    报错为: selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for firefox using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location   个人解决办法: 重新下载selenium-manager.exe并替换原文件即可 selenium-m

    2024年02月02日
    浏览(48)
  • WPF应用程序生存期以及相关事件

     WPF 应用程序的生存期会通过 Application 引发的几个事件来加以标记,相关事件对应着应用程序何时启动、激活、停用和关闭。 应用程序生存期事件 • 独立应用程序(传统风格的 Windows 应用程序,这些应用程序作为要安装到客户端计算机并从客户端计算机运行的可执行程序集

    2024年01月20日
    浏览(28)
  • exe程序,多屏模式下打开应用,应用自动在副屏开启,多用于大屏展示项目。

    在展厅大屏项目中我们经常会用到一个电脑显示器+大屏投影或者LED大屏显示的情况,往往是电脑显示器作为主屏控制软件画面开启,大屏作为拓展屏显示软件内容,但是在开启软件时会默认显示在主屏(电脑显示器)上,通常的做法我们需要再将窗口画面拖拽至副屏才可以显

    2024年02月11日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包