使用C#实现一个PPT遥控器
说明
本项目参考了 https://github.com/yangzhongke/PhoneAsPrompter 项目来完成实现,并对其进行了一些修改完善。
完整代码可以到 https://github.com/PuZhiweizuishuai/PPT-Remote-control 与 https://gitee.com/puzhiweizuishuai/PPT-Remote-control 查看。
软件下载地址: https://gitee.com/puzhiweizuishuai/PPT-Remote-control/releases/v1.0.0
另外,由于程序vb.net教程启动后会创c#教程建一个WEB服务器,用来python基础教程显示PPT的操控界java基础教程面,所以某些安全软件可能会报毒。但是程序本身sql教程是没有问题的。
截图
具体实现
通过在Win Form项目中内嵌一个Kestrel Web服务器,我们就可以通过浏览器向web服务器发送请求来接收远程操作指令。之后通过Late Binding的方式去操作PPT。
1、在 Win Form项目中内嵌HTTP服务器
在Form窗口启动时,我们新建一个Kestrel服务器
this.webHost = new WebHostBuilder().UseKestrel().Configure(ConfigureWebApp).UseUrls("http://*:" + port).Build();// 异步运行服务器this.webHost.RunAsync();
然后对其进行配置
private void ConfigureWebApp(IApplicationBuilder app){app.UseDefaultFiles();app.UseStaticFiles();app.Run(async (context) =>{// 处理非静态请求 var request = context.Request;var response = context.Response;string path = request.Path.Value;response.ContentType = "application/json; charset=UTF-8";bool hasRun = true;if (path == "/report"){string value = request.Query["value"];this.BeginInvoke(new Action(() => {this.PageLabel.Text = value;}));response.StatusCode = 200;await response.WriteAsync("ok");}else{response.StatusCode = 404;}});}
操作PPT
首先,由于涉及到了COM编程,我们需要注意内存回收与释放,所以需要用到COMReferenceTracker
类进行应用管理。
每一步用到COM的地方,都要用T方法进行资源回收。
private dynamic T(dynamic comObj){return this.comReference.T(comObj);}
以下操作使用dynamic
进行操作,所有操作需要去查询VBA文档了解具体用法,以下仅演示部分操作
打开一个PPT的操作实现
private void button1_Click(object sender, EventArgs e){// 文件选择框openFileDialog.Filter = "ppt文件|*.ppt;*.pptx;*.pptm";if (openFileDialog.ShowDialog() != DialogResult.OK){return;}string filename = openFileDialog.FileName;this.ClearComRefs();// 创建 PPT 对象dynamic pptApp = T(PowerPointHelper.CreatePowerPointApplication());// 显示 PPTpptApp.Visible = true;dynamic presentations = T(pptApp.Presentations);// 打开 PPTthis.presentation = T(presentations.Open(filename));// 全屏显示T(this.presentation.SlideShowSettings).Run();}
PPT上一个动画操作实现
T(T(presentation.SlideShowWindow).View).Previous();
下一步,与上一个操作类似,只需更换Previous()
方法为Next()
即可。
获取注释
首先我们需要一个方法去解析注释
private string GetInnerText(dynamic part){StringBuilder sb = new StringBuilder();dynamic shapes = T(T(part).Shapes);int shapesCount = shapes.Count;for (int i = 0; i < shapesCount; i++){dynamic shape = T(shapes[i + 1]);var textFrame = T(shape.TextFrame);// MsoTriState.msoTrue==-1if (textFrame.HasText == -1){string text = T(textFrame.TextRange).Text;sb.AppendLine(text);}sb.AppendLine();}return sb.ToString();}
之后通过
dynamic notesPage = T(T(T(T(presentation.SlideShowWindow).View).Slide).NotesPage);
string notesText = GetInnerText(notesPage);
我们就可以获取具体每页的注释信息。
完善服务器
了解了以上的PPT操作之后,我们就需要去完善我们的Web服务器端配置。
用户访问相应的地址,然后去执行上面PPT操作部分的代码即可。
else if (path == "/getNote"){string notesText = null;this.Invoke(new Action(() => {if (this.presentation == null){return;}try{dynamic notesPage = T(T(T(T(presentation.SlideShowWindow).View).Slide).NotesPage);notesText = GetInnerText(notesPage);}catch (COMException ex){notesText = "";}}));await response.WriteAsync(notesText);}else if (path == "/next"){response.StatusCode = 200;this.Invoke(new Action(() => {if (this.presentation == null){return;}try{T(T(this.presentation.SlideShowWindow).View).Next();hasRun = true;} catch (COMException e){hasRun = false;}}));if (hasRun){await response.WriteAsync("OK");}else{await response.WriteAsync("NO");}}else if (path == "/previous"){response.StatusCode = 200;this.Invoke(new Action(() => {if (this.presentation == null){return;}try{T(T(this.presentation.SlideShowWindow).View).Previous();hasRun = true;}catch (COMException e){hasRun = false;}}));if (hasRun){await response.WriteAsync("OK");}else{await response.WriteAsync("NO");}
完成前端
通过轮询的方式,不断的向服务端发送请求,获取最新的消息,这样我们就可以实现通过浏览器去操作PPT了。
<!DOCTYPE html><html lang="zh-cn">
<head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="renderer" content="webkit" /><title>操作你的PPT</title><link rel="icon" href="/logo.ico"><style>div {font-size: 25px}</style>
</head>
<body><div id="main" style="width:100vw;height:100vh;"><p id="note"></p></div><script src="hammer.min.js"></script><script>function httpGet(url, cb) {fetch(url, {headers: {'Content-Type': 'application/json; charset=UTF-8'},method: 'GET'}).then(response => response.text()).then(text => {cb(text)}).catch(e => {return null})}const note = document.querySelector("#note");let hasRun = truelet getNotes = setInterval(() => {httpGet('/getNote', (text) => {note.innerText = text})}, 500)function nextPage() {httpGet('/next', (text) => {if (text == 'NO') {clearInterval(getNotes)note.innerText = "幻灯片播放完毕!"hasRun = false} else {if (!hasRun) {getNotes = setInterval(() => {httpGet('/getNote', (text) => {note.innerText = text})}, 500)hasRun = true}}})}function previousPage() {httpGet('/previous', (text) => {if (text == 'NO') {clearInterval(getNotes)note.innerText = "幻灯片播放完毕!"hasRun = false} else {if (!hasRun) {getNotes = setInterval(() => {httpGet('/getNote', (text) => {note.innerText = text})}, 500)hasRun = true}}})}var hammer = new Hammer(document.querySelector("#main"));hammer.on("swipeleft", function () {nextPage();});hammer.on("swiperight", function () {previousPage();});</script>
</body>
</html>
分类: C#
使用C#实现一个PPT遥控器相关推荐
- iphone for PPT遥控器 MyPoint PowerPoint Remote
周五的时候要给同事做一个培训,因为要用写字板还要翻PPT所以觉得很麻烦,突然想到以前看到一款软件,装在手机上能当PPT遥控器用,随即百度...终于找到了. 一个手机端,一个PC端,手机端得连上wifi ...
- C# 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档
原文:C# 复制幻灯片(包括格式.背景.图片等)到同/另一个PPT文档 C# 复制幻灯片(包括格式.背景.图片等)到同/另一个PPT文档 复制幻灯片是使用PowerPoint过程中的一个比较常见的操作 ...
- 如何用LaTeX写一个PPT
如何用LaTeX写一个PPT 说到写PPT大家一般会想到的是微软的Microsoft PowerPoint,因为他更易于制作并且拥有丰富的动画,但是当你需要制作一个学术相关的ppt时,你需要更好的排 ...
- 炸裂了!3分钟用GPT4做一个PPT!
GPT4有多强了,相信体验过的同学都知道,一个字爽!无论是速度,还是数据集还是功能都比3.5要强大很多.现在越来越多的人开始用GPT4了,可以大幅的提高我们的工作和学习的效率,今天小编就用GPT4快速 ...
- 【资源分享】疫情居家一个月,精心整理了一个PPT资源社区(含模板-资源-高级技巧)
写在前面 由于疫情原因,前前后后居家了一个多月,期间属实无聊,便倒腾起来放在家里半年不用的的电脑,发现上面还残留不少好东西,于是下决心好生整理一番.其中包括许多前端学习资料.电子书.PPT学习资源等. ...
- 怎么把多个ppt文件合并到一个ppt文件中?
1.在电脑上打开一个目标PPT文件,然后依次点击菜单栏选项"开始/新建幻灯片/重用幻灯片". 2.点击"重用幻灯片"后会在右侧出现一个选项对话框. 3.点击&q ...
- 小软件推荐 - PPT遥控器
推荐个小软件 - PPT遥控器,扫扫二维码,手机即可变身翻页器,APP版本还有备注显示和激光笔功能. PPT遥控器做的极为简洁,却非常好用,是百度难得的良心作品.前段时间给用户培训,一时没找到翻页器, ...
- 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档
复制幻灯片(包括格式.背景.图片等)到同/另一个PPT文档 复制幻灯片是使用PowerPoint过程中的一个比较常见的操作,在复制一张幻灯片时一般有以下两种情况: 在同一个PPT文档内复制 从一个PP ...
- 如何从另一个PPT中提取母版(WPS)
1.想按照格式的PPT模板写ppt,因此需要提取它的模板 2.百度半天才得门道,下面记下来以备后来查看. 3.先打开一个PPT.点击视图>幻灯片母版,右键copy第一个PPT. 4.打开正在写的 ...
最新文章
- 通过Ajax来简单的实现局部刷新(主要为C#中使用的UpdatePanel控件和ScriptManager控件)...
- junit4/5 getDefaultClassLoader()Ljava/lang/ClassLoader;
- php中的冒号应用,php中双冒号的应用
- JUnit通过失败测试案例
- windows server 2019 服务器搭建的方法步骤(图文)
- python统计行号_用Python实现两个文件的不同行的编号
- python论坛签到_Python实现某论坛自动签到功能
- vsftpd基于mysql_vsftpd基于mysql实现用户认证
- html5 按钮css样式修改,css样式制作的漂亮按钮
- 图文解析如何配置网络交换机配置
- Blurry Box加密技术使用的7种方法
- 关于移动Web性能的5个神话(转)
- GPL和LGPL的区别!
- vb.net 窗体接收键盘事件_不用100就能够买到全键盘的无线键鼠套装,双飞燕FG1010魅力依旧...
- 基于ASP.NET通用后台管理系统模板
- sourcetree神操作
- Android【Socket通讯】
- 结合计算机专业与数学的论文,数学计算机论文,关于计算机技术基础数学结合模式相关参考文献资料-免费论文范文...
- ENDC优先选网流程介绍
- 2.1 Mybatis——log4j日志文件应用
热门文章
- 一个复杂的“预算”模板设计
- HTML5中地理位置
- python apkg_Python 自动加固APK
- cropping IplImage most effectively
- html scale属性,CSS中的zoom属性和scale属性的用法及区别
- Python全国等级考试大纲
- 【144页/附下载】5G最新进展深度解析—全集完整版
- html 发帖 表情 图片,HTML那些可爱的“表情包”
- 如何在C语言游戏代码中加入音乐?
- 【嵌入式基础】内存(Cache,RAM,ROM,Flash)