综合网上资源完成的自己的第一篇博客

------------------------------------------------------------------------

网上类似的贴子挺多的,由于情况不太一样。网上相关帖子都是在 MainWindow 嵌入。我需要在原有客户端上开发新的插件即用户控件库实现嵌入外部exe。

主要问题:获取不到窗口句柄。

1、利用系统API实现嵌入。

         [DllImport("user32.dll", SetLastError = true)]
public static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

2、当时在获取页面(用户控件库)的句柄问题上碰壁,主要思路是在页面上加Border、Grid等类似的容器控件。然后可通过程序集“PresentationCore”里的方法获取。

但需要注意的是,不能在页面加载过程中获取句柄。可在button的click事件触发、容器控件的load事件触发、、、

 using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Interop;
using System.Reflection;
using System.IO; namespace AlarmCenter.Addin.RunVLC
{
/// <summary>
/// HomePage.xaml 的交互逻辑
/// </summary>
public partial class HomePage
{
string RootPath;
//定义变量
private IntPtr prsmwh;//外部exe文件运行句柄
private Process process;//外部exe文件对象
public HomePage()
{
InitializeComponent();
RootPath = AlarmCenter.Core.General.GetApplicationRootPath();//获取相对可执行文件路径
} public void RunVLC()
{
//获取当前窗口句柄
IntPtr handle = ((HwndSource)PresentationSource.FromVisual(bd_test)).Handle; string path = null;
var currentAssembly = Assembly.GetEntryAssembly();
var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName;
if (currentDirectory == null) return;
//初始化配置,指定可执行文件路径
if (AssemblyName.GetAssemblyName(currentAssembly.Location).ProcessorArchitecture == ProcessorArchitecture.X86)
path = RootPath + @"\bin\VLCPlayerSDK\libvlc_x86\vlc.exe";
else
path = RootPath + @"\bin\VLCPlayerSDK\libvlc_x64\vlc.exe"; process = Process.Start(path, RootPath + "\\bin\\宣传片\\test.mkv -f --no-video-title-show --repeat --no-interact --video-on-top --mouse-hide-timeout=1");
prsmwh = process.MainWindowHandle;
while (prsmwh == IntPtr.Zero)
{
prsmwh = process.MainWindowHandle;
}
//设置父窗口
SDK.SetParent(prsmwh, handle);
SDK.ShowWindowAsync(prsmwh, );//子窗口最大化
} public override void Dispose()
{
process?.Kill();
base.Dispose();
} private void Bd_test_Loaded(object sender, RoutedEventArgs e)
{
RunVLC();
}
}
}

WPF用户控件库 嵌入外部(VLC)exe的更多相关文章

  1. [WPF 学习] 3.用户控件库使用资源字典的困惑

    项目需要(或者前后端分离的需要),前端我使用了用户控件库,由后端用代码加载和控制. 然而用户控件库没法指定资源字典,于是在用户控件的xaml文件里面手工添加了资源字典 <UserControl. ...

  2. 创建WPF用户控件

    wpf用户自定义控件和winform创建方法类似,这里先纠正一个误区,就是有很多人也是添加,然后新建,然后是新建用户控件库,但是为什么编译好生成后Debug目录下还是只有exe文件而没有dll文件呢? ...

  3. WPF 免费控件库

    https://github.com/Infragistics/InfragisticsThemesForMicrosoftControls 几款WPF免费控件库,不过运行源码时需要下载三个DLL , ...

  4. C# WPF开源控件库:MahApps.Metro

    其实站长很久之前就知道这个开源WPF控件库了,只是一直欣赏不了这种风格,但也star了该项目.每次浏览该仓库时,发现star越来越多,也看到很多网友对它的褒奖,所以今天就向大家推荐这款WPF控件库. ...

  5. WPF 用户控件嵌入网页

    WPF使用用户控件嵌入网页,直接使用WebBrowser或Frame会产生报错,报错信息如下: 1.使用WebBrowser,<WebBrowser Source="http://19 ...

  6. 使用CefSharp 在C#用户控件中嵌入Chrome浏览器使用方法

    CEF(Chromium Embedded Framework, 嵌入式Chromium框架)是C/C++开发的库 目前 Google Chrome(Google浏览器),Chromium浏览器,Op ...

  7. 【demo练习四】:WPF用户控件案例

    首先,新建vs中“用户控件(WPF)”,右键项目名 =>"添加"按钮 => 选择“新建项”. 然后选择“用户控件(WPF)” => 起名字 => 点击“添加 ...

  8. WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘

    依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是 ...

  9. WPF 免费控件库(2)

    最近在逛园子的时候发现的园友分享或提及的WPF控件库~ (1) Bootstrap WPF Style,Bootstrap风格的WPF样式 转:http://www.cnblogs.com/tsliw ...

随机推荐

  1. DataTable表连接

    public static System.Data.DataTable TableJoin(System.Data.DataTable dt, System.Data.DataTable dtDeta ...

  2. 编译https://github.com/CIR-KIT/steer_drive_ros时出现的问题

    解决gazebo对应的protobuf版本问题: I've come across to the same problem. I'm using Ubuntu 16.04, ROS Kinetic a ...

  3. mybatis学习 十二 多表查询

    Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...

  4. apm飞行模式

    参考 :https://www.cnblogs.com/jins-note/p/9580054.html   复制别人的,因为很久(几年)玩一次,所以会忘,也不好找,,若作者要求,请给留言,会立即删除 ...

  5. MZOJ 1344 工作依赖

    这道题并不是很难,关键在于读入; 其余只需一个遍历;(考的时候傻逼兮兮的没写出来) 另外,学到了一个 isdigit()用来判断是否是0-9的数字; #include <bits/stdc++. ...

  6. 【转】Centos 7 修改主机名hostname

    在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始 ...

  7. MySQL批量修改表前缀

    error_reporting(0); $old_pre = 'tdr_'; // 原表前缀 $new_pre = 'db_'; // 新表前缀 // 配置连接 $db = new mysqli('1 ...

  8. python3 提示 name ‘reload’ is not defined

    import importlib importlib.reload(sys)

  9. python 安装教程

    1) 安装python2.7,下载地址 https://www.python.org/downloads/   ----2.7 安装完成后,设置环境变量加入path   --d:/ruanjian/p ...

  10. Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)

    一.Mybatisplus通用(公共方法)CRUD,一共17种(3.0.3版),2.3系列也是这么多,这个新版本一定程度进行了改造和删减. 二.构造器UML图(3.0.3)-----实体包装器,主要用 ...