由于本人需要参加的讨论会比较多,每次都会涉及到PPT,有时候坐在电脑旁讲会比较不生动,前人就发明了演示文档遥控器,今天就给大家介绍下基于C#实现ppt遥控器,感兴趣的朋友一起看看吧
目录
说明截图具体实现1、在获胜形式项目中内嵌超文本传送协议服务器操作演示文档获取注释完善服务器完成前端
说明
本项目参考了https://github.com/yangzhongke/PhoneAsPrompter项目来完成实现,并对其进行了一些修改完善。
完整代码可以到https://github.com/PuZhiweizuishuai/PPT-Remote-control与https://gitee.com/puzhiweizuishuai/PPT-Remote-control查看。
软件下载地址:https://gitee。com/puzhiweizui Shuai/PPT-Remote-control/releases/v 1。0 .0
另外,由于程序启动后会创建一个网服务器,用来显示演示文档的操控界面,所以某些安全软件可能会报毒。但是程序本身是没有问题的。
截图
具体实现
通过在获胜形式项目中内嵌一个红隼网服务器,我们就可以通过浏览器向网服务器发送请求来接收远程操作指令。之后通过后期绑定的方式去操作PPT。
1、在 Win Form项目中内嵌HTTP服务器
在形式窗口启动时,我们新建一个红隼服务器
this.webHost=新的WebHostBuilder()。UseKestrel()。配置(配置web应用程序)。使用URL(' http://*:'端口)。build();
//异步运行服务器
这个。网络主机。运行async();
然后对其进行配置
私有void配置web应用程序(IApplicationBuilder应用程序)
{
应用程序.UseDefaultFiles();
应用程序.UseStaticFiles();
应用程序.运行(异步(上下文)=1
{
//处理非静态请求
定义变量请求=上下文。请求;
定义变量响应=上下文。回应;
字符串路径=请求.路径。价值
回应content type=' application/JSON;charset=UTF-8 ';
bool hasRun=true
if (path=='/report ')
{
字符串值=请求。查询['值'];
这个BeginInvoke(新操作(()={
这个page label . com。文本=值
}));
回应StatusCode=200
等待回应写异步(' ok ');
}
其他
{
回应StatusCode=404
}
});
}
操作PPT
首先,由于涉及到了计算机输出缩微胶片编程,我们需要注意内存回收与释放,所以需要用到COMReferenceTracker类进行应用管理。
每一步用到计算机输出缩微胶片的地方,都要用T方法进行资源回收。
私有动态t(动态comObj)
{
返回这个。com参考。t(comObj);
}
以下操作使用动态的进行操作,所有操作需要去查询VBA文档了解具体用法,以下仅演示部分操作
打开一个演示文档的操作实现
私有void button1_Click(对象发送方,EventArgs e)
{
//文件选择框
打开文件对话框.Filter='ppt文件|*.ppt*。pptx*。pptm ';
if (openFileDialog .ShowDialog()!=对话结果。好的)
{
返回;
}
string filename=openFileDialog .文件名;
这个ClearComRefs();
//创建演示文档对象
动态pptApp=T(PowerPointHelper .CreatePowerPointApplication());
//显示演示文档
pptApp .可见=真;
动态演示=T(pptApp .演示文稿);
//打开演示文档
this.presentation=T演示文稿。打开(文件名));
//全屏显示
t(这个。演示文稿。幻灯片放映设置).run();
}
演示文档上一个动画操作实现
T(T(演示。幻灯片显示窗口)。查看)。previous();
下一步,与上一个操作类似,只需更换上一个()方法为下一个()即可。
获取注释
首先我们需要一个方法去解析注释
私有字符串GetInnerText(动态部分)
{
StringBuilder sb=new StringBuilder();
动态形状=T(T(零件)。形状);
int形状计数=形状。数数;
for(int I=0;我塑造了一个伯爵;我)
{
动态shape=T(shapes[I 1]);
var textFrame=T(shape .文字框架);
//MsoTriState.msoTrue==-1
if (textFrame .HasText==-1)
{
string text=T(textFrame .TextRange).文本;
某人(有人的简写)AppendLine(文本);
}
某人(有人的简写)AppendLine();
}
归还某人ToString();
}
之后通过
动态notes page=T(T(T(T(T(演示。幻灯片显示窗口)。查看)。幻灯片)。备注页);
string notes text=GetInnerText(notes page);
我们就可以获取具体每页的注释信息。
完善服务器
了解了以上的演示文档操作之后,我们就需要去完善我们的网服务器端配置。
用户访问相应的地址,然后去执行上面演示文档操作部分的代码即可。
else if (path=='/getNote ')
{
字符串注释文本=空
这个。调用(新操作(()={
if (this.presentation==null)
{
返回;
}
尝试
{
动态notes page=T(T(T(T(T(演示。幻灯片显示窗口)。查看)。幻灯片)。备注页);
notes text=GetInnerText(注释页);
}
catch (COMException ex)
{
注释文本=" ";
}
}));
等待回应写异步(notes文本);
}
else if (path=='/next ')
{
回应StatusCode=200
这个。调用(新操作(()={
if (this.presentation==null)
{
返回;
}
尝试
{
T(T(这个。演示文稿。幻灯片放映窗口).查看)。next();
hasRun=true
} catch (COMException e)
{
hasRun=false
}
}));
if (hasRun)
{
等待回应写异步(' OK ');
}
其他
{
等待回应WriteAsync(“否");
}
}
else if (path=='/previous ')
{
回应StatusCode=200
这个。调用(新操作(()={
if (this.presentation==null)
{
返回;
}
尝试
{
T(T(这个。演示文稿。幻灯片放映窗口).查看)。previous();
hasRun=true
}
捕捉(异常e)
{
hasRun=false
}
}));
if (hasRun)
{
等待回应写异步(' OK ');
}
其他
{
等待回应WriteAsync(“否");
}
完成前端
通过轮询的方式,不断的向服务端发送请求,获取最新的消息,这样我们就可以实现通过浏览器去操作演示文档了。
!文档类型超文本标记语言
html lang='zh-cn '
头
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 '/
标题操作你的PPT/标题
link rel=' icon ' href='/logo。ico ' rel='外部无跟随'
风格
部门{
字体大小:25px
}
/风格
/头
身体
div id=' main ' style=' width:100 VW;身高:100米
p id='note'/p
/div
script src=' hammer。量滴js '/脚本
脚本
函数httpGet(url,cb) {
获取(url,{
标题:{
内容类型":"应用程序/JSON;charset=UTF-8 '
},
方法:"获取"
}).then(response=response.text())。然后(text={
cb(文本)
})。catch(e={
返回空
})
}
const note=文档。查询选择器(“# note”);
设hasRun=true
让getNotes=setInterval(()={
httpGet('/getNote ',(text)={
note.innerText=text
})
}, 500)
函数nextPage() {
httpGet('/next ',(text)={
if (text=='NO') {
clearInterval(getNotes)
note.innerText='幻灯片播放完毕!'
hasRun=false
}否则{
如果(!hasRun) {
getNotes=setInterval(()={
httpGet('/getNote ',(text)={
note.innerText=text
})
}, 500)
hasRun=true
}
}
})
}
函数previousPage() {
httpGet('/previous ',(text)={
if (text=='NO') {
clearInterval(getNotes)
note.innerText='幻灯片播放完毕!'
hasRun=false
}否则{
如果(!hasRun) {
getNotes=setInterval(()={
httpGet('/getNote ',(text)={
note.innerText=text
})
}, 500)
hasRun=true
}
}
})
}
var Hammer=新锤子(文档。查询选择器(“# main”);
hammer.on('swipeleft ',function () {
下一页();
});
hammer.on('swiperight ',function () {
上一页();
});
/脚本
/body
/html
到此这篇关于使用C#实现一个演示文档遥控器的文章就介绍到这了,更多相关C#实现演示文档遥控器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。