iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么使用C#实现一个PPT遥控器
  • 198
分享到

怎么使用C#实现一个PPT遥控器

2023-06-15 02:06:23 198人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关怎么使用C#实现一个PPT遥控器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明本项目参考了 https://GitHub.com/yangzhongke/PhoneAsPrompte

这篇文章给大家分享的是有关怎么使用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

另外,由于程序启动后会创建一个WEB服务器,用来显示PPT的操控界面,所以某些安全软件可能会报毒。但是程序本身是没有问题的。

截图

怎么使用C#实现一个PPT遥控器

具体实现

通过在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());            // 显示 PPT            pptApp.Visible = true;            dynamic presentations = T(pptApp.Presentations);            // 打开 PPT            this.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==-1                if (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" rel="external nofollow" >    <style>        div {            font-size: 25px        }    </style></head><body>    <div id="main" >        <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 = true        let 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#实现一个PPT遥控器”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 怎么使用C#实现一个PPT遥控器

本文链接: https://www.lsjlt.com/news/276852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用C#实现一个PPT遥控器
    目录说明截图具体实现1、在 Win Form项目中内嵌HTTP服务器操作PPT获取注释完善服务器完成前端说明 本项目参考了 https://github.com/yangzhongk...
    99+
    2024-04-02
  • 怎么使用C#实现一个PPT遥控器
    这篇文章给大家分享的是有关怎么使用C#实现一个PPT遥控器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明本项目参考了 https://github.com/yangzhongke/PhoneAsPrompte...
    99+
    2023-06-15
  • CSS怎么实现遥控器按钮功能
    本篇内容主要讲解“CSS怎么实现遥控器按钮功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS怎么实现遥控器按钮功能”吧!html结构<view class="bu...
    99+
    2023-07-04
  • 使用c#怎么实现一个颜色选择控件
    使用c#怎么实现一个颜色选择控件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码://颜色拾取框using System;using System.Com...
    99+
    2023-06-14
  • C#中怎么实现一个日历控件
    本篇文章给大家分享的是有关C#中怎么实现一个日历控件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。定制C#日历控件在把会议添加到数据库中之前,先修改一下日历的显示。***用另一...
    99+
    2023-06-18
  • 华为云服务器怎么用手机控制电视遥控器使用
    如果您想使用华为云服务器,以控制电视遥控器,您可以按照以下步骤操作: 打开华为云官网,注册账户并登录账号。 打开华为云应用市场,找到相应的应用程序。 在应用程序列表中找到电视遥控器应用程序。 点击“安装”按钮。 弹出下载界面,选择您的手...
    99+
    2023-10-26
    华为 用手 遥控器
  • 使用Canvas怎么实现一个手势控制功能
    使用Canvas怎么实现一个手势控制功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先讲一下思路:首先跟图需求可以知道,作出这样的效果需要一组对象,每个对象有颜色,所占...
    99+
    2023-06-09
  • 使用Asp.NET怎么实现一个限流控制功能
    使用Asp.NET怎么实现一个限流控制功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、AspNetCoreRateLimit 介绍AspNetCoreRa...
    99+
    2023-06-08
  • 使用C/C++怎么实现一个推箱子小游戏
    这篇文章给大家介绍使用C/C++怎么实现一个推箱子小游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何实现首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组。2.定义小猪,箱子,墙,空地等信息在三维数组...
    99+
    2023-06-15
  • 使用C#怎么实现一个简易画图板
    本篇文章为大家展示了使用C#怎么实现一个简易画图板,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。定义公共变量用于多个窗体之间共同使用数据public class TempData...
    99+
    2023-06-14
  • 华为云服务器怎么用手机控制电视遥控器使用方法
    1. 确认手机和电视连接在同一网络下 在使用手机控制电视遥控器之前,需要确保手机和电视连接在同一网络下。可以通过手机连接同一 Wi-Fi 网络或者使用手机热点让电视连接上来实现。 2. 下载并安装华为云服务器 APP 华为云服务器 APP...
    99+
    2023-10-26
    华为 用手 遥控器
  • ASP.NET中怎么实现一个服务器控件
    ASP.NET中怎么实现一个服务器控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ASP.NET组件设计之ASP.NET服务器控件1、用户控件类似page,基本上不需要编程,...
    99+
    2023-06-18
  • 使用python怎么实现一个定时器
    这期内容当中小编将会给大家带来有关使用python怎么实现一个定时器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚...
    99+
    2023-06-14
  • 使用JavaScript怎么实现一个计算器
    这期内容当中小编将会给大家带来有关使用JavaScript怎么实现一个计算器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体内容如下<!DOCTYPE html><html&...
    99+
    2023-06-14
  • C#中怎么利用WinForm控件实现一个下拉式属性编辑器
    这篇文章将为大家详细讲解有关C#中怎么利用WinForm控件实现一个下拉式属性编辑器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先我们要创建一个用于编辑属性的控件,在本系列文章的开始,我...
    99+
    2023-06-17
  • 华为云服务器怎么用手机控制电视遥控器
    如果您想使用华为云服务器控制电视遥控器,您需要下载并安装华为云服务器的客户端应用,该应用可以帮助您在您的智能手机上创建账户并将智能设备加入到华为云服务器中。 具体步骤如下: 打开手机设置应用,找到云服务器选项,点击进入。 找到“创建新用...
    99+
    2023-10-26
    华为 用手 遥控器
  • C++中怎么实现一个LeetCode
    这篇文章给大家介绍C++中怎么实现一个LeetCode,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。[LeetCode] 128.Longest Consecutive Sequence 求最长连续序列Given an...
    99+
    2023-06-20
  • VB.NET 中怎么实现一个Label控件
    VB.NET 中怎么实现一个Label控件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.设置标签的文本在VB.NET Label控件中显示文本,使用“Text”属性。在开发...
    99+
    2023-06-17
  • 在C# 中使用Socke实现一个UDP
    这篇文章给大家介绍在C# 中使用Socke实现一个UDP,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NE...
    99+
    2023-06-06
  • 怎么利用C++实现一个反射类
    这篇文章主要讲解了“怎么利用C++实现一个反射类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用C++实现一个反射类”吧!代码环境为VScode + CMake + GCC 8.1.0...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作