前一段时间接到一个需求(大概内容讲一下): 将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 }
大功告成!
希望有需要的能够受用~~~~ 第一次写博客,希望大佬们能多多斧正。