首页 > 编程语言 >如何在WPF中嵌入其它程序

如何在WPF中嵌入其它程序

时间:2024-11-19 10:57:07浏览次数:1  
标签:IntPtr 嵌入 int WM 其它 User32 WPF public

在WPF中嵌入其它程序,这里提供两种方案

 

一、使用WindowsFormHost

使用步骤如下

1、添加WindowsFormsIntegration和System.Windows.Forms引用 

 

2、在界面上放置WindowsFormHost和System.Windows.Forms.Panel

1   <Grid>
2       <WindowsFormsHost>
3           <winform:Panel x:Name="panel"></winform:Panel>
4       </WindowsFormsHost>
5   </Grid>

 

3、运行被嵌入的程序,获取主窗口句柄,然后调用WinAPI SetParent函数设置被嵌入的程序的父级为panel

Winform控件是有句柄的,直接调用SetParent函数即可。

1  var process = System.Diagnostics.Process.Start("xxx.exe");
2 
3  SetParent(process.MainWindowHandle, this.panel.Handle);

这种方案理论可行,但我没有具体尝试。

 

2、手动控制被嵌入程序的位置和状态

这里我们以WPF嵌入WPF来进行演示,其它程序也可以嵌入,但是要注意:被嵌入的窗口必须是无边框且置顶的。

 

ChildWindow.xaml

 1 <Window x:Class="ChildWindow.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:ChildWindow"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="450" Width="800" WindowStyle="None" AllowsTransparency="True" Topmost="True" ShowInTaskbar="False">
 9     <Grid Background="LightGray">
10         <Label Content="Child Window" HorizontalAlignment="Center" VerticalAlignment="Center"></Label>
11     </Grid>
12 </Window>

 

HostWindow.xaml

 1 <Window x:Class="WPFHostDemoShell.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:WPFHostDemoShell"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
 9     <Grid x:Name="Host">
10 
11     </Grid>
12 </Window>

 

在窗口的Loaded事件中创建其它程序进程,并嵌入 。

在此之前我们需要要入一些WinAPI函数签名。

 1     public class User32
 2     {
 3         public const uint SWP_SHOWWINDOW = 0x0040;
 4         public const uint WM_USER = 0x0400;
 5         public const uint WM_Normal = WM_USER + 1;  //正常显示消息
 6         public const uint WM_Minimal = WM_USER + 2; //最小化消息
 7         public const uint WM_Exit = WM_USER + 3;    //退出消息
 8 
 9         [DllImport("User32.dll")]
10         public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
11 
12         [DllImport("User32.dll")]
13         public static extern uint SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
14     }

 

窗口的Loaded事件中处理如下:

 1 IntPtr childWindowHandle = IntPtr.Zero;
 2 
 3 private async void Window_Loaded(object sender, RoutedEventArgs e)
 4 {
 5     var childExePath = Environment.CurrentDirectory + "\\ChildWindow.exe";
 6     if (System.IO.File.Exists(childExePath) == false)
 7         return;
 8 
 9     var process = System.Diagnostics.Process.Start(childExePath);
10     process.WaitForInputIdle();
11 
12     await Task.Delay(200);
13 
14     var point = this.Host.PointToScreen(new Point(0, 0));
15 
16     User32.SetWindowPos(process.MainWindowHandle, IntPtr.Zero, (int)point.X, (int)point.Y, (int)this.Host.ActualWidth, (int)this.Host.ActualHeight, User32.SWP_SHOWWINDOW);
17     childWindowHandle = process.MainWindowHandle;
18 }

 

此时我们运行后,就可以看到窗口已经被嵌入 

 

此时我们还需要处理一些窗口的事件,比如最大化,最小化,移动和大小改变等。

这里我们可以借助WinAPI SendMessage函数来对进程进行简单通信。

 

我们在ChildWindow增加Win32消息的处理

 1 protected override void OnSourceInitialized(EventArgs e)
 2 {
 3     base.OnSourceInitialized(e);
 4 
 5     HwndSource.FromHwnd(new WindowInteropHelper(this).Handle).AddHook(HwndSourceHook);
 6 }
 7 
 8 protected IntPtr HwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
 9 {
10     switch(msg)
11     {
12         case User32.WM_Minimal:
13             this.WindowState = WindowState.Minimized;
14             break;
15         case User32.WM_Normal:
16             this.WindowState = WindowState.Normal;
17             break;
18         case User32.WM_Exit:
19             this.Close();
20             break;
21     }
22 
23     return IntPtr.Zero;
24 }

 

在父窗口中,窗口状态改变时,发送消息到子窗口即可

 

标签:IntPtr,嵌入,int,WM,其它,User32,WPF,public
From: https://www.cnblogs.com/zhaotianff/p/18554445

相关文章

  • 数据赋能未来趋势探索:嵌入式BI技术的挑战与突破
    最新技术资源:https://www.grapecity.com.cn/resources/数据分析能力越来越成为消费者和企业的必备品应用程序,复杂程度各不相同,从简单地一个网页或门户上托管一个可视化或仪表板,到在一个云服务上实现数据探索、建模、报告和可视化创建的应用程序。BI的实现方式越来越多,无......
  • WPF Datagrid event command in mvvm via behavior
    <DataGridTemplateColumnHeader="Image"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanelOrientation="Horizontal"><CheckBoxIsThree......
  • 清华姚班校友马腾宇,发布了他的首个多模态嵌入模型:「多模态检索」实现SOTA
    清华姚班校友马腾宇和他的团队,推出了自创业以来的首个多模态嵌入模型voyage-multimodal-3,而且发布即“SOTA”。据介绍,在对3个多模态检索任务(共20个数据集)进行评估时,voyage-multimodal-3比第二名平均高出了19.63%的检索准确率。这是为包含丰富视觉和文本的文档提供......
  • 调试WPF数据绑定的几种方法
    最近在帮一些小伙伴解决问题时,会遇到各种奇奇怪怪的问题。比较典型的包括命名空间错误,如System.Drawing.Brushes类型和System.Windows.Media.Brushes类型错误使用,导致在Converter中,颜色转换不生效。数据绑定错误,这个导致的原因比较多,所以这里我们总结一下如何调试数据绑定。 ......
  • 100 款支持 .NET 多版本的强大 WPF 控件库
    前言推荐一款集成了超过100款控件的流行XAML控件库,同时提供了一系列常用的.NET帮助类-CookPopularUI。它可以简化开发流程,让我们能够更加专注于核心业务逻辑的实现。让我们一起学习如何使用CookPopularUI,并详细了解其提供的丰富控件内容。项目介绍CookPopularUI不仅提供......
  • 揭晓测振仪与其它仪器之间的区别
    测振仪作为一种专门用于检测振动的仪器,在实际应用中与其他检测仪器有着一些明显的区别。下面将从几个方面对测振仪与其它检测仪器的区别进行比较。首先,测振仪与其他检测仪器的区别在于其测量的对象。测振仪主要用于测量物体或系统在运动过程中的振动情况,通过检测振动的频率、......
  • 基于WPF开发视频播放器
    在实际应用中,视频播放功能在很多软件中都会用到,将音频和视频集成到应用程序中不仅可以增强用户体验,还能起到事半功倍的效果。今天本文以一个简单的小例子,简述如何通过WPF中的MediaElement开发视频播放器,仅供学习分享使用,如有不足之处,还请指正!涉及知识点在本实例中,开发视频播放器......
  • 使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
    当涉及到图数据时,复杂性是不可避免的。无论是社交网络中的庞大互联关系、像Freebase这样的知识图谱,还是推荐引擎中海量的数据量,处理如此规模的图数据都充满挑战。尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时,更需要一种不会在庞大数据量下崩溃的解决方案。PyTorch......
  • 走进嵌入式开发世界
    目录一、概述二、嵌入式开发的核心要素2.1.硬件平台选择与设计2.1.1.处理器选择2.1.2.电路设计2.1.3.硬件集成与测试2.2.软件开发与调试2.2.1.编程语言选择2.2.2.操作系统与中间件2.2.3.软件架构与模块化设计2.2.4.调试与测试三、系统优化与功耗管理3.1.......
  • 《痞子衡嵌入式半月刊》 第 111 期
    痞子衡嵌入式半月刊:第111期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。本期刊是开源项目(GitHub:JayHeng/pzh-mcu-bi-weekly),欢迎提交issue,投稿或推荐你知道的嵌入式那些事儿。上期回顾:《痞子衡嵌入式半月......