前一段时间接到一个需求(大概内容讲一下): 将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. git 批量删除本地分支及远程分支

    git 批量删除本地分支及远程分支 一.批量删除本地分支 git branch |grep 'name' |xargs git branch -D 备注: name 为需要匹配的分支名称 二.批量删除 ...

  2. Redis 入门 - 五大基础类型及其指令学习

    经过前面Redis入门系列三篇文章学习,相信大家已经准备好学习新知识了,到这里也算是真正开始学习Redis了.学习了软件安装,客户端选择,那么接下来也应该来了解Redis有什么,能干什么. 我们在第一 ...

  3. VS2022 17.12.0 Preview2版本对Copilot的功能增强

    前提条件,使用最新版的17.12.0 Preview2,并且有有效的Copilot AI订阅,那么可以体验这个新鲜好用的功能 增强了Copilot AI对IEnumerable Visualizer的 ...

  4. ZEGO 即构科技首发适配鸿蒙系统的 Express SDK 1.0 版本

    ​ 2019年8月,华为在开发者大会上正式发布鸿蒙系统. HarmonyOS 鸿蒙系统是一款"面向未来".面向全场景(移动办公.运动健康.社交通信.媒体娱乐等)的分布式操作系统.在 ...

  5. Vert.x HttpClient调用后端服务时使用Idle Timeout和KeepAlive Timeout的行为分析

    其实网上有大量讨论HTTP长连接的文章,而且Idle Timeout和KeepAlive Timeout都是HTTP协议上的事情,跟Vert.x本身没有太大关系,只不过最近在项目上遇到了一些问题,用到 ...

  6. JavaScript – ES6-ES2023 大杂烩

    前言 一年半没有写 JS 了, 今天开始来个大复习, 顺便把这么多年零零散散的知识点做成笔记. 练练字. ES 3, 5, 6, 2017, 2018... ES 6 等于 ES2015 ES 7 等 ...

  7. 记一次 公司.NET项目部署在Linux环境压测时 内存暴涨分析

    一:背景 讲故事 公司部署在某碟上的项目在9月份压测50并发时,发现某个容器线程.内存非正常的上涨,导致功能出现了异常无法使用.根据所学,自己分析了下线程和内存问题,分析时可以使用lldb或者wind ...

  8. QT6框架WebEngine模块之WebEngine总体介绍以及WebEngine能做什么?

    QT6框架WebEngine模块之WebEngine总体介绍以及WebEngine能做什么? 简介 本文简略介绍QT6框架WebEngine模块之WebEngine总体介绍以及WebEngine能做什 ...

  9. Java项目笔记(一)

    一.springboot控制台打印sql日志 ---------.mapper为你启动类扫描的mapper路径 logging.level.---------.mapper = debug 二.前端传 ...

  10. ModbusTCP通信协议分析

    前言 大家好!我是付工.前面给大家介绍了一系列关于RS485与Modbus的知识. 终于有人把RS485说清楚了 终于有人把Modbus说明白了 通透!终于把ModbusRTU弄明白了 今天跟大家聊聊 ...