前一段时间接到一个需求(大概内容讲一下): 将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. Docker 知识梳理及其安装使用

    Docker 介绍 Docker 是一个强大的工具,用于高效开发.打包和部署应用程序.Docker 是一种容器管理服务.Docker 于 2013 年发布.它是开源的,可用于 Windows.macO ...

  2. Round #2022/11/26

    问题 B:染色 题目描述 有长度为 \(n\) 的一个序列,编号为 \(1\) 到 \(n\) ,现要对这些元素进行染色标记,若编号 \(i-j\) 为素数,且 \(1\le i < j \le ...

  3. CSS – Display block, inline, inline-block

    前言 之前 W3Schools 学习笔记就有提到了 CSS Layout - The display Property 这篇做更多的解释. 参考: CSS Display FLEX vs Block, ...

  4. iManager for K8S 配置https证书流程步骤

    针对10.1及之前版本,需要手动去配置证书,未来版本会考虑进行界面化配置. 一.提前准备 1. 证书需要准备三个文件 *.key *.crt private.pem 2. 如果没有修改iManager ...

  5. Windows11忘记开机密码重置

    在锁屏页面按着shift键重启,找到命令行输入一下两行代码 copy c:\windows\system\system32\utilman.exe c:\windows\system32\utilma ...

  6. java爬取航班实时数据

    使用jsoup获取航班实时数据 优先使用携程航班数据  如果携程航班数据返回为空 则使用去哪儿航班信息 pom.xml <dependency> <groupId>org.js ...

  7. thinkphp中的or,like,in等联合查询

    数据库中的两个字段有一个字段等于查询条件时,下面两个方法都是可以的: (1) $where['a.goods_name|a.goods_sn'] = array('like',"%$keyW ...

  8. ArgoWorkflow教程(六)---无缝实现步骤间参数传递

    之前我们分析了,Workflow.WorkflowTemplate .template 3 者之间如何传递参数. 本文主要分析同一个 Workflow 中的不同 step 之间实现参数传递,比如将上一 ...

  9. 使用 Debugger 断点 如果打开了断点调试 就会跳转空白页面

    <!DOCTYPE html> <html> <header> <title>test</title> </header> &l ...

  10. 大模型存储选型 & JuiceFS 在关键环节性能详解

    从去年开始,LLM大语言模型领域发展迅速.如 LLaMA.ChatGLM.Baichuan.Qwen 和 yi-model 等基础模型(Foundation Models)的数量显著增加.众多企业也开 ...