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

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

网上类似的贴子挺多的,由于情况不太一样。网上相关帖子都是在 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. paxos 练手 推进中

    学习https://github.com/huoyu820125/SecondPaxos 自己编写网络版本 在学习过程将此代码的线程 锁等改成c++11  就不用包含那么多文件 主要更改如下 // M ...

  2. Netsharp下微信菜单以及OAuth

    一.OAuth介绍 在微信开发中,当打开一个页面是,业务场景一般会基于粉丝绑定用户信息,即页面需要基于粉丝和用户的身份处理业务逻辑. 在微信中打开一个页面有三个场景: 1.文本回复中直接包含url 2 ...

  3. centos6.5上配置apache + mysql + php4.4.9 + eaccelerator-0.9.5 + postgresql-8.3.13 备忘

    1.apache + mysql 直接利用 yum 安装 yum -y install httpd httpd-devel mysql mysql-server httpd-manual mod_pe ...

  4. Flex 排序 SortField and Sort

    部分代码 var arrayOfCat:ArrayCollection=outerDocument.getCagegory();   // 需要排序的数组 //创建SortField对象 var so ...

  5. SpringBoot注册Servlet/Filter/Listener

    由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,那么没有web.xml文件,如何配置我们的三大Web基础组件呢? 通过使用XXXRe ...

  6. 添加/删除-HTML DOM 常用对象 -BOM-打开和关闭窗口- history-location

    1. 添加/删除 3步: 1. 添加一个空元素 var a=document.createElement("a"); <a></a> 2. 定义元素的关键属 ...

  7. Keras框架下使用CNN进行CIFAR-10的识别测试

    有手册,然后代码不知道看一下:https://keras-cn.readthedocs.io/en/latest/ 首先是下载数据集,下载太慢了就从网盘上下载: 链接:https://pan.baid ...

  8. TP5在lnmp环境中不能重写的问题

    说到坑,这个问题困扰了我一两天时间,本地可以,线上环境检查了好久. 基本检查的地方有几个了,首先就是nginx下面的重写配置,这个大家在网上都能搜到,至于定义的变量和配置路径,修改一下即可. 还有就是 ...

  9. 2019.01.19 codeforces915E.Physical Education Lessons(ODT)

    传送门 ODT水题(当然可以上线段树) 支持区间01覆盖,询问全局1的个数. 思路:直接上ODTODTODT. 不会的点这里 代码: #include<bits/stdc++.h> #de ...

  10. 2018.10.25 bzoj4350: 括号序列再战猪猪侠(区间dp)

    传送门 区间dp好题. 首先我们并不用把右括号拿进来一起dpdpdp,而是直接用左括号来dpdpdp. 然后定义状态fi,jf_{i,j}fi,j​表示区间[l,r][l,r][l,r]的合法方案数. ...