说明

本项目参考了 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遥控器相关推荐

  1. iphone for PPT遥控器 MyPoint PowerPoint Remote

    周五的时候要给同事做一个培训,因为要用写字板还要翻PPT所以觉得很麻烦,突然想到以前看到一款软件,装在手机上能当PPT遥控器用,随即百度...终于找到了. 一个手机端,一个PC端,手机端得连上wifi ...

  2. C# 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档

    原文:C# 复制幻灯片(包括格式.背景.图片等)到同/另一个PPT文档 C# 复制幻灯片(包括格式.背景.图片等)到同/另一个PPT文档 复制幻灯片是使用PowerPoint过程中的一个比较常见的操作 ...

  3. 如何用LaTeX写一个PPT

    如何用LaTeX写一个PPT  说到写PPT大家一般会想到的是微软的Microsoft PowerPoint,因为他更易于制作并且拥有丰富的动画,但是当你需要制作一个学术相关的ppt时,你需要更好的排 ...

  4. 炸裂了!3分钟用GPT4做一个PPT!

    GPT4有多强了,相信体验过的同学都知道,一个字爽!无论是速度,还是数据集还是功能都比3.5要强大很多.现在越来越多的人开始用GPT4了,可以大幅的提高我们的工作和学习的效率,今天小编就用GPT4快速 ...

  5. 【资源分享】疫情居家一个月,精心整理了一个PPT资源社区(含模板-资源-高级技巧)

    写在前面 由于疫情原因,前前后后居家了一个多月,期间属实无聊,便倒腾起来放在家里半年不用的的电脑,发现上面还残留不少好东西,于是下决心好生整理一番.其中包括许多前端学习资料.电子书.PPT学习资源等. ...

  6. 怎么把多个ppt文件合并到一个ppt文件中?

    1.在电脑上打开一个目标PPT文件,然后依次点击菜单栏选项"开始/新建幻灯片/重用幻灯片". 2.点击"重用幻灯片"后会在右侧出现一个选项对话框. 3.点击&q ...

  7. 小软件推荐 - PPT遥控器

    推荐个小软件 - PPT遥控器,扫扫二维码,手机即可变身翻页器,APP版本还有备注显示和激光笔功能. PPT遥控器做的极为简洁,却非常好用,是百度难得的良心作品.前段时间给用户培训,一时没找到翻页器, ...

  8. 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档

    复制幻灯片(包括格式.背景.图片等)到同/另一个PPT文档 复制幻灯片是使用PowerPoint过程中的一个比较常见的操作,在复制一张幻灯片时一般有以下两种情况: 在同一个PPT文档内复制 从一个PP ...

  9. 如何从另一个PPT中提取母版(WPS)

    1.想按照格式的PPT模板写ppt,因此需要提取它的模板 2.百度半天才得门道,下面记下来以备后来查看. 3.先打开一个PPT.点击视图>幻灯片母版,右键copy第一个PPT. 4.打开正在写的 ...

最新文章

  1. 通过Ajax来简单的实现局部刷新(主要为C#中使用的UpdatePanel控件和ScriptManager控件)...
  2. junit4/5 getDefaultClassLoader()Ljava/lang/ClassLoader;
  3. php中的冒号应用,php中双冒号的应用
  4. JUnit通过失败测试案例
  5. windows server 2019 服务器搭建的方法步骤(图文)
  6. python统计行号_用Python实现两个文件的不同行的编号
  7. python论坛签到_Python实现某论坛自动签到功能
  8. vsftpd基于mysql_vsftpd基于mysql实现用户认证
  9. html5 按钮css样式修改,css样式制作的漂亮按钮
  10. 图文解析如何配置网络交换机配置
  11. Blurry Box加密技术使用的7种方法
  12. 关于移动Web性能的5个神话(转)
  13. GPL和LGPL的区别!
  14. vb.net 窗体接收键盘事件_不用100就能够买到全键盘的无线键鼠套装,双飞燕FG1010魅力依旧...
  15. 基于ASP.NET通用后台管理系统模板
  16. sourcetree神操作
  17. Android【Socket通讯】
  18. 结合计算机专业与数学的论文,数学计算机论文,关于计算机技术基础数学结合模式相关参考文献资料-免费论文范文...
  19. ENDC优先选网流程介绍
  20. 2.1 Mybatis——log4j日志文件应用

热门文章

  1. 一个复杂的“预算”模板设计
  2. HTML5中地理位置
  3. python apkg_Python 自动加固APK
  4. cropping IplImage most effectively
  5. html scale属性,CSS中的zoom属性和scale属性的用法及区别
  6. Python全国等级考试大纲
  7. 【144页/附下载】5G最新进展深度解析—全集完整版
  8. html 发帖 表情 图片,HTML那些可爱的“表情包”
  9. 如何在C语言游戏代码中加入音乐?
  10. 【嵌入式基础】内存(Cache,RAM,ROM,Flash)