WPF嵌入外部exe应用程序-实现基本的嵌入

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

使用场景

在WPF桌面应用程序开发过程中,有时候需要将其他程序结合到一起,让他看起来是一个程序,就需要把其他程序的窗口,作为子窗体,嵌入到程序中去。如果都是自己程序,可以将其他程序的项目直接导入引用。

在以下几种情况,可能无法直接修改和调用源程序。

  • 其他人员开发,无法获取源代码,无权对源码进行修改
  • exe并非使用C#相关框架(WPF/Winform)开发,比如用unity开发的程序

这种时候就只能通过直接将打包的exe程序嵌入到当前程序中去。

功能实现

嵌入基本功能实现

1.导入windows API

需要调用Windows API的SetParentMoveWindow,通过DllImport将API加载进来

SetParent通过句柄将一个窗体设为另一个窗体的父窗体。

MoveWindow改变指定窗口的位置和大小.对基窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.对于Owned窗口,位置和大小取决于屏幕左上角.

[DllImport("user32.dll", SetLastError = true)]
public static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
 
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

2.运行外部程序

使用Process运行外部程序(以画图程序为示例),需要将外部程序设置为正常的窗体样式,最大化状态的窗体无法嵌入。

var exeName = "C:\\WINDOWS\\system32\\mspaint";
//使用Process运行程序
Process p = new Process();
p.StartInfo.FileName = exeName;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.Start();

3. 获取窗体句柄

循环判断运行的外部程序窗体句柄,如果不为零就说明程序已经运行,获取他的句柄。

WPF中控件无法获取句柄,只能获取窗体的句柄,使用WindowInteropHelper获取WPF的窗体句柄

      while (p.MainWindowHandle.ToInt32() == 0)
            {
                System.Threading.Thread.Sleep(100);
            }
            IntPtr appWin = p.MainWindowHandle;
            IntPtr hwnd = new WindowInteropHelper(this).Handle;

4. 嵌入窗体

使用 SetParent将外部程序窗体嵌入当前窗体

 SetParent(appWin, hwnd);

效果如下:

窗体已经嵌入称为当前窗体的子窗体,可以跟随移动,子窗体也无法移出父窗体位置。

WPF嵌入外部exe应用程序-实现基本的嵌入,WPF,wpf

5.设置子窗体位置

嵌入窗体之后,子窗体位置可以随机放置,我们可以通过MoveWindow来设置子窗体的位置和大小

  MoveWindow(appWin, 0, 0, 500, 400, true);

效果:
WPF嵌入外部exe应用程序-实现基本的嵌入,WPF,wpf

整个代码

完整实现的代码:

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 = new WindowInteropHelper(this).Handle;//当前窗体(主程序)句柄
//设置父窗体(实现窗体嵌入)
SetParent(appWin, hwnd);
//设置窗体位置和大小
MoveWindow(appWin, 0, 0, 500, 400, true);

嵌入存在的问题:

  1. WPF控件无法获取句柄,只能直接在窗体下操作嵌入
  2. 嵌入窗体大小无法实时跟随变化
  3. 嵌入窗体保留了窗体样式和边框,无法现成一个整体
  4. 嵌入窗体永远附在最顶层,会遮挡其他控件

WPF嵌入外部exe应用程序-实现基本的嵌入,WPF,wpf

后续更新:文章来源地址https://www.toymoban.com/news/detail-599028.html

  1. 通过WindowsFormsHost在WPF中调用winform的控件来解决控件没有句柄问题,进行封装控件,解决问题1和2;
  2. 问题3需要使用其他Windows API来解决;
  3. 问题4暂时没有解决办法,只能避免。

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

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

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

相关文章

  • 如何签署exe或Windows应用程序?

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

    2024年02月09日
    浏览(43)
  • 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日
    浏览(69)
  • (二)WPF - 应用程序

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

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

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

    2024年02月08日
    浏览(67)
  • 使用Electron打包vue文件变成exe应用程序

    克隆下载Electron: 链接: electron-quick-start 1.下载之后安装Electron依赖 npm安装electron总失败使用下面的安装方式 2.安装打包运行 代码如下(示例): 代码如下(示例): 代码如下(示例): 打包后得路径修改成为./,避免Electron打包exe后显示空白 修改生产环境配置,配置为后端

    2024年01月24日
    浏览(48)
  • 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日
    浏览(71)
  • WPF应用程序生存期以及相关事件

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

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

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

    2024年02月11日
    浏览(109)
  • windows11 出现SearchHost.exe应用程序崩溃事件原因分析

    3月15日之后,点击搜索框的时候总是卡顿,点不开,查看系统事件,发现系统出现上万条的SearchHost.exe事件。参照微软网站上的回复,重建了索引,重装了应用都不能解决问题。鉴于之前没有出现过这个问题,于是把最近安装的软件全部卸载,依然没解决问题。 最后怀疑是系

    2024年02月11日
    浏览(71)
  • 【YOLOv5】YOLOv5打包成exe应用程序详细步骤

    YOLOv5打包成exe应用程序详细步骤(auto-py-to-exe) 1.进入自己创建的的anaconda虚拟环境。 2.下载auto-py-to-exe,大概几秒钟就可以安装好。 3.启动auto-py-to-exe。 4.启动auto-py-to-exe之后,选择脚本位置,设置单文件和控制台窗口,在“高级”里面找到\\\"–hidden-port\\\",填写上 models.yolo ,完毕

    2024年02月05日
    浏览(80)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包