欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何在wpf窗口中播放PPT。

程序员文章站 2022-04-10 15:37:17
前一段时间接到一个需求(大概内容讲一下): 将PPT播放窗口嵌入到我们的系统中,用自己系统控制PPT的播放,在PPT页面上可以手写将手写内容记录下来。 一开始,对于WPF还是一个彩笔的我是懵逼的。后来在网上查找了一些资料,终于倒腾出来了。在这里记录一下。 参考资料: http://www.jb51. ......

前一段时间接到一个需求(大概内容讲一下): 将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         }

大功告成!

 

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