如何在wpf窗口中播放PPT。
前一段时间接到一个需求(大概内容讲一下): 将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。的更多相关文章
- 如何在WPF程序中使用ArcGIS Engine的控件
原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET ...
- Wpf窗口中打开WinForm窗口
获取wpf窗口对应的句柄窗口 using System; using System.Windows; using System.Windows.Interop; using IWin32Window ...
- 如何在DOS窗口中显示UTF-8字符
在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即 ...
- 如何在wpf程序中使用DependencyProperty
作为例子,我决定定义一个MyBorderEx,在WPF常用的"Border"控件中创建一个名为Transparency的属性,来指示它的透明度,这个属性值在0-255间变化,255 ...
- 在 WPF 程序中应用 Windows 10 真?亚克力效果
原文:在 WPF 程序中应用 Windows 10 真?亚克力效果 从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了.不过相比于 UWP 来说, ...
- 在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)
前言: AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等.在C#程序中使用摄像头,我习惯性使用AForge.NET提供的类库.本 ...
- 如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来
原文:如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来 title: "如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来" publishDate: 2019-06 ...
- WPF中播放视频音频
首先要在WPF中播放视频和音频,我们就需要用到MediaElement控件,下面我们示例播放音频和视频. 用MediaElement播放音频: 第一步:将你需要播放的音频(mp3)放在你WPF项目的D ...
- 【msdn wpf forum翻译】如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点?
原文:[msdn wpf forum翻译]如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点? 原文链接:http://social.msdn.microsoft.com/Fo ...
- 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 ...
随机推荐
- ST-SSL: 用于交通流量预测的时空自监督学习《Spatio-Temporal Self-Supervised Learning for Traffic Flow Prediction》(交通流量预测、时空异质性、自监督、数据增强)
2023年10月23日,继续论文,好困,想发疯. 论文:Spatio-Temporal Self-Supervised Learning for Traffic Flow Prediction Git ...
- 安全 – CSP (Content Security Policy)
前言 之前讲过 CSRF.防 Cookie hacking 的. 也介绍过防 XSS 的 HtmlSanitizer. 今天再介绍 CSP. 参考 Content Security Policy 介绍 ...
- Azure – 对比 AWS Research Report
前言 最近有机会接触了一下 AWS, 在对比完之后决定继续用 Azure, 这里小小记入一下. VM & SQL Server Azure 和 AWS 都可以选择 2 in 1, 或者 Web ...
- SpringMVC —— SpringMVC简介
SpringMVC SpringMVC技术 与 Servlet技术功能等同,均属于web层开发技术 是一种基于java实现MVC模型的轻量级Web框架 SpringMVC 入门案例 ...
- SqlEs-像使用数据库一样使用Elasticsearch
SqlEs SqlEs是Elasticsearch的客户端JDBC驱动程序,支持采用sql语法操作Elasticsearch.SqlEs构建在RestHighLevelClient,屏蔽了RestHi ...
- IDEA更改远程git仓库地址
前言 我们在使用IDEA开发时,一般会配置好对应的git仓库,这样就比较容易对代码进行控制以及协同开发. 但有时候,我们远程的仓库地址由于这样那样的原因,需要迁移(这在爱折腾的企业是常有的事情). ...
- iOS中NSBundle使用小结
bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,文本文件,属性列表,语言包,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle ...
- tauri2.0-admin桌面端后台系统|tauri2+vite5+element-plus管理后台EXE程序
原创Tauri2.0+Vue3+ElementPlus客户端通用后台管理系统Tauri2Admin. tauri2-vue3-admin基于最新跨平台框架 Tauri2.0 整合 Vite5+Vue3 ...
- KubeSphere 社区双周报|2024.06.21-07.04
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- KubeSphere 3.3.0 发布:全面拥抱 GitOps
2022 年 6 月 27 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.3.0 正式发布! CNCF 发布的 2021 年度调查报告指出,容器和 K8s 的事实地位已 ...