前一段时间接到一个需求(大概内容讲一下): 将PPT播放窗口嵌入到我们的系统中,用自己系统控制PPT的播放,在PPT页面上可以手写将手写内容记录下来。

一开始,对于WPF还是一个彩笔的我是懵逼的。后来在网上查找了一些资料,终于倒腾出来了。在这里记录一下。

参考资料: http://www.jb51.net/article/63266.htm   (就是一个c#操作PPT的例子,很管用)

接来下讲讲我自己的思路:

1.按照链接的例子一样,打开,操作 PPT 是没有问题了。

2.用WIN32 API 将PPT播放窗口句柄嵌入到我自己的WPF窗口中。

3.在PPT窗口的外面蒙上一层透明的画板。(这里不讲详细将实现,思路就是在PPT窗口上面再覆盖一层透明窗口。)

接来下讲讲我自己的实现:

1.首先要新建一个用来盛放PPT播放窗口的Window。命名为:PptPlayerView。

 1 <Window x:Class="Ezy.Blackboard.Views.PptPlayerView"
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:Ezy.Blackboard.Views"
7 mc:Ignorable="d"
8 Title="PptPlayerView" Height="300" Width="300"
9 WindowStyle="None"
10 ResizeMode="NoResize"
11 WindowState="Maximized">
12 <Grid x:Name="Panel">
13
14 </Grid>
15 </Window>

2.Window建好了,接下来就是要在打开窗口的时候打开PPT并开放出一些控制PPT的方法,已供调用。

2.1. 首先添加两个引用,定义一些属性:

1 using Microsoft.Office.Core;
2 using ppt = Microsoft.Office.Interop.PowerPoint;
1         public ppt.Presentation ObjPrs { get; private set; }
2
3 public ppt.SlideShowView OSlideShowView { get; private set; }
4
5 public ppt.Application ObjApp { get; private set; }

2.2. 构造函数:

1         public PptPlayerView()
2 {
3 InitializeComponent();
4 //防止连续打开多个PPT程序.
5 if (ObjApp != null) { return; }
6 ObjApp = new ppt.Application();
7 }

2.3.一些操作PPT的方法:

 1         /// <summary>
2 /// 打开PPT
3 /// </summary>
4 /// <param name="url"></param>
5 /// <returns></returns>
6 public ppt.Presentation OpenPpt(string url)
7 {
8 var objPresSet = ObjApp.Presentations;
9 var objPrs = objPresSet.Open(url, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);
10 return objPrs;
11 }

42 /// <summary>
43 /// 下一页
44 /// </summary>
45 /// <returns></returns>
46 public int Next()
47 {
48 OSlideShowView.Next();
49 var index = OSlideShowView.Slide.SlideIndex - 1;
50 return index;
51 }
52
53 /// <summary>
54 /// 上一页
55 /// </summary>
56 /// <returns></returns>
57 public int Previous()
58 {
59 OSlideShowView.Previous();
60 var index = OSlideShowView.Slide.SlideIndex - 1;
61 return index;
62 }
63
64 /// <summary>
65 /// 跳到制定页
66 /// </summary>
67 /// <param name="index"></param>
68 /// <returns></returns>
69 public int GoToSlide(int index)
70 {
71 OSlideShowView.GotoSlide(index);
72 return index;
73 }

3.播放PPT,并将PPT嵌入到PptPlayerView中。

3.1.引用WIN 32 API 先。(主要用到了SetParent这个API)

[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr childIntPtr, IntPtr parentIntPtr);

3.2.播放PPT的方法:

 1         /// <summary>
2 /// 播放ppt
3 /// </summary>
4 /// <param name="objPrs"></param>
5 public void PlayPpt(ppt.Presentation objPrs)
6 {
7 ObjPrs = objPrs;
8 //进入播放模式
9 var objSlides = objPrs.Slides;
10 var objSss = objPrs.SlideShowSettings;
11 objSss.LoopUntilStopped = MsoTriState.msoCTrue;
12 objSss.StartingSlide = 1;
13 objSss.EndingSlide = objSlides.Count;
14 objSss.ShowType = ppt.PpSlideShowType.ppShowTypeKiosk;
15 var sw = objSss.Run();
16
17 OSlideShowView = objPrs.SlideShowWindow.View;
18 var wn = (IntPtr)sw.HWND;
19
20 //嵌入窗体
21 var fromVisual = (HwndSource)PresentationSource.FromVisual(Panel);
22 if (fromVisual == null)
23 {
24 return;
25 }
26 var parentHwnd = fromVisual.Handle;
27 SetParent(wn, parentHwnd);
28 }

3.3, 窗口关闭的时候,别忘了关PPT。

 1 private void PptPlayWindow_OnLoaded(object sender, RoutedEventArgs e)
2 {
3 Closed += OnClosed;
4 }
5
6 private void OnClosed(object sender, EventArgs eventArgs)
7 {
8 try
9 {
10 ObjPrs.Close();
11 ObjApp.Quit();
12 }
13 catch
14 {
15
16 }
17 }

大功告成!

希望有需要的能够受用~~~~ 第一次写博客,希望大佬们能多多斧正。

如何在wpf窗口中播放PPT。的更多相关文章

  1. 如何在WPF程序中使用ArcGIS Engine的控件

    原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET ...

  2. Wpf窗口中打开WinForm窗口

    获取wpf窗口对应的句柄窗口 using System; using System.Windows; using System.Windows.Interop; using IWin32Window ...

  3. 如何在DOS窗口中显示UTF-8字符

    在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即 ...

  4. 如何在wpf程序中使用DependencyProperty

    作为例子,我决定定义一个MyBorderEx,在WPF常用的"Border"控件中创建一个名为Transparency的属性,来指示它的透明度,这个属性值在0-255间变化,255 ...

  5. 在 WPF 程序中应用 Windows 10 真?亚克力效果

    原文:在 WPF 程序中应用 Windows 10 真?亚克力效果 从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了.不过相比于 UWP 来说, ...

  6. 在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)

    前言: AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等.在C#程序中使用摄像头,我习惯性使用AForge.NET提供的类库.本 ...

  7. 如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来

    原文:如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来 title: "如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来" publishDate: 2019-06 ...

  8. WPF中播放视频音频

    首先要在WPF中播放视频和音频,我们就需要用到MediaElement控件,下面我们示例播放音频和视频. 用MediaElement播放音频: 第一步:将你需要播放的音频(mp3)放在你WPF项目的D ...

  9. 【msdn wpf forum翻译】如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点?

    原文:[msdn wpf forum翻译]如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点? 原文链接:http://social.msdn.microsoft.com/Fo ...

  10. How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?

    原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behi ...

随机推荐

  1. 如何使用ChatGPT自带插件

    OpenAI的插件将ChatGPT连接到第三方应用程序.这些插件使ChatGPT能够与开发者定义的API进行交互,增强ChatGPT的能力,并使其能够执行广泛的操作.插件使ChatGPT能够做如下事情 ...

  2. 击败全球上千参赛队伍,合合信息获ICDAR“文本篡改检测”赛道冠军

    AI技术的快速发展激发了人们对于美好未来的畅享,也带来了潜在的危机,数据泄露.电信诈骗等系列风险与隐患开始浮出水面.利用科技手段构建可信的技术发展环境,保护使用者的信息及财产安全,正在成为行业共识. ...

  3. Angular 18+ 高级教程 – Component 组件 の Dynamic Component 动态组件

    前言 Angular 是 MVVM 框架. MVVM 的宗旨是 "不要直接操作 DOM". 为了这个 "不要直接操作 DOM",我们已经讲了 2 篇文章了. 第 ...

  4. 【QT性能优化】QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化

    [QT性能优化]QT性能优化之QT6框架高性能模型视图代理框架千万级数据表分层查询优化 简介 本文使用QT树状控件QTreeView快速展示SQLite数据库中的1000万条具有层次结构的数据记录,当 ...

  5. Flutter Forward 活动正式发布

    2023 年 1 月 25 日,Flutter 团队将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播,敬请期待! 活动将于北京时间 1 月 25 日 22:30 开始 ...

  6. 以太坊Rollup方案之 arbitrum(2)

    上一期简单介绍了一下rollup的一些基本内容以及aritrun交易的执行流程,这一期将介绍一下aritrum的核心技术 -- 交互式单步证明 这一期主要涉及到的是arbitrum的验证节点 arbi ...

  7. C#上位机与PLC通信心跳的实现方法

    -Begin- 大家好!我是付工.众所周知,在工业自动化控制系统中,上位机与下位机之间的通信是实现自动化生产的关键环节之一.为了确保通信的稳定性和可靠性,我们通用会采用一种被称为[心跳机制]的方法,它 ...

  8. .Net Web项目中,实现轻量级本地事件总线 框架

    一.事件总线设计方案 1.1.事件总线的概念 事件总线是一个事件管理器,负责统一处理系统中所有事件的发布和订阅. 事件总线模式通过提供一种松耦合的方式来促进系统内部的业务模块之间的通信,从而增强系统的 ...

  9. 《你必须掌握的Entity Framework 6.x与Core 2.0》代码下载

      https://item.jd.com/12376014.html<你必须掌握的Entity Framework 6.x与Core 2.0>代码下载,共享代码: https://git ...

  10. GLSL利用SDF进行矩形绘制公式推导

    简单记录一下关于SDF绘制矩形的公式推导,因为我们在iq的SDF代码中,给的直接是最后的推导结果,对它是怎么得来的,还是有点困惑. //这是利用sdf绘制矩形 float sdBox( in vec2 ...