·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 如何实现用windows phone控制PowerPoint的播放

如何实现用windows phone控制PowerPoint的播放

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

如何实现用windows phone控制Powerpoint的播放

  相信大家都有过演讲的经历,当我们演讲时,一手拿着windows phone手机按按键就可以操作powerPoint幻灯片的播放,是不是显得比较高端?你如果想了解这种互动是怎么实现的,那么你可以继续往下看。

  使用windows phone操作PC的PPT播放并不是一件多难的事儿,同样是对于android和IOS移动端,主要涉及到两个方面:通信和调用PowerPoint 的API。对于第一方面,既然手机端可以控制PC端,那么他们之间必然有信息传递,你可以使用手机的蓝牙和电脑的蓝牙进行通信,不过考虑到现在的PC还有很多不支持蓝牙,再加上蓝牙传输可能并不稳定,所以在这里我们可以使用Socket进行通信;对于第二方面,也很简单,我们只需要在PC端去调用PowerPoint的API就OK,主要涉及的操作包括:切换幻灯片到第一张、切换幻灯片到下一张、切换幻灯片到上一张、切换幻灯片到最后一张。

  举个例子来说,我们当用手机点击上一页按钮时,会传递一个数字a到服务端,服务端会判断这个数字a是要执行切换到上一页操作的命令,所以我们就调用切换到上一页的API,就能成功实现切换,所以如果想实现这个功能不仅仅需要手机客户端,还需要一个PC的服务端用来接收手机端发来的消息并进行处理,当然手机端需要输入PC端ip和端口来和PC端通信,我在这里仅实现了最基本的功能,其他功能可以在此基础上进行扩展。

  下面首先介绍服务端调用PowerPoint API 的代码:(参考了貌似是一位微软工程师的博客)

  

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Runtime.InteropServices;  5 using System.Text;  6 using System.Threading.Tasks;  7 using PPt = Microsoft.Office.Interop.PowerPoint;  8 namespace ServerPPT  9 { 10     class PPTServer 11     { 12         // 定义PowerPoint应用程序对象 13         PPt.application pptApplication; 14         // 定义演示文稿对象 15         PPt.PResentation presentation; 16         // 定义幻灯片集合对象 17         PPt.Slides slides; 18         // 定义单个幻灯片对象 19         PPt.Slide slide; 20  21         // 幻灯片的数量 22         int slidescount; 23         // 幻灯片的索引 24         int slideIndex; 25         //检查幻灯片是否已经打开 26         public void CheckPPT() 27         { 28             // 必须先运行幻灯片,下面才能获得PowerPoint应用程序,否则会出现异常 29             // 获得正在运行的PowerPoint应用程序 30             try 31             { 32                 pptApplication = Marshal.GetActiveObject("PowerPoint.Application") as PPt.Application; 33  34                 // 成功获取了PowerPoint程序时,使UI按钮可用 35             } 36             catch 37             { 38                 //  MessageBox.Show("请先启动遥控的幻灯片", "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); 39             } 40             if (pptApplication != null) 41             { 42                 //获得演示文稿对象 43                 presentation = pptApplication.ActivePresentation; 44                 // 获得幻灯片对象集合 45                 slides = presentation.Slides; 46                 // 获得幻灯片的数量 47                 slidescount = slides.Count; 48                 // 获得当前选中的幻灯片 49                 try 50                 { 51                     // 在普通视图下这种方式可以获得当前选中的幻灯片对象 52                     // 然而在阅读模式下,这种方式会出现异常 53                     slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber]; 54                 } 55                 catch 56                 { 57                     // 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象 58                     slide = pptApplication.SlideShowWindows[1].View.Slide; 59                 } 60             } 61         } 62  63         //第一页 64         public  void FirstPage() 65         { 66             try 67             { 68                 // 在普通视图中调用Select方法来选中第一张幻灯片 69                 slides[1].Select(); 70                 slide = slides[1]; 71             } 72             catch 73             { 74                 // 在阅读模式下使用下面的方式来切换到第一张幻灯片 75                 pptApplication.SlideShowWindows[1].View.First(); 76                 slide = pptApplication.SlideShowWindows[1].View.Slide; 77             } 78         } 79         //上一页 80         public void PreviousPage() 81         { 82             slideIndex = slide.SlideIndex - 1; 83             if (slideIndex >= 1) 84             { 85                 try 86                 { 87                     slide = slides[slideIndex]; 88                     slides[slideIndex].Select(); 89                 } 90                 catch 91                 { 92                     // 在阅读模式下使用下面的方式来切换到上一张幻灯片 93                     pptApplication.SlideShowWindows[1].View.Previous(); 94                     slide = pptApplication.SlideShowWindows[1].View.Slide; 95                 } 96             } 97             else 98             { 99                 // MessageBox.Show("已经是第一页了");100             }101         }102 103         //下一页104         public void NextPage()105         {106             slideIndex = slide.SlideIndex + 1;107             if (slideIndex > slidescount)108             {109                 //MessageBox.Show("已经是最后一页了");110             }111             else112             {113                 try114                 {115                     slide = slides[slideIndex];116                     slides[slideIndex].Select();117                 }118                 catch119                 {120                     // 在阅读模式下使用下面的方式来切换到下一张幻灯片121                     pptApplication.SlideShowWindows[1].View.Next();122                     slide = pptApplication.SlideShowWindows[1].View.Slide;123                 }124             }125         }126         //最后一页127         public void LastPage()128         {129             try130             {131                 slides[slidescount].Select();132                 slide = slides[slidescount];133             }134             catch135             {136                 // 在阅读模式下使用下面的方式来切换到最后幻灯片137                 pptApplication.SlideShowWindows[1].View.Last();138                 slide = pptApplication.SlideShowWindows[1].View.Slide;139             }140         }141     }142 }

    其次介绍服务端PC和和客户端(windows phone)使用Socket通信的代码,服务端等待接收消息代码如下所示:

 

 1         Socket listenner = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 2         private Control control = new Control(); 3          4         public Form1() 5         { 6             InitializeComponent(); 7             TextBox.CheckForIllegalCrossThreadCalls = false; 8              9         }10         //打印提示信息11         public void showMessage(String strMsg)12         {13            output.AppendText(strMsg + "\r\n");14         }15         private static AutoResetEvent _flipFlop = new AutoResetEvent(false);16         private void start_Click(object sender, EventArgs e)17         {18             19             20             IPAddress address = IPAddress.Parse(iptext.Text.Trim());//创建IP对象21 22             IPEndPoint localEP = new IPEndPoint(address,int.Parse(porttext.Text.Trim()));23 24           //  MessageBox.Show("运行中");25                  showMessage("本地IP地址和端口是"+localEP);26                 listenner.Bind(localEP);27                 listenner.Listen(10);28                 Thread threadlisten;//定义监听线程29                 threadlisten = new Thread(startlisten);30                 threadlisten.IsBackground = true;//创建线程时默认false,为false时,主线程退出,仍然执行,直到结束31                 threadlisten.Start();32 33         }34         private void startlisten() {35             while (true)36             {37                 // Console.WriteLine("等待windows phone客户端的连接。。。。");38                 showMessage("等待windows phone客户端的连接");39                 listenner.BeginAccept(AcceptCallback, listenner);40                 _flipFlop.WaitOne();41             }42         }43         private void AcceptCallback(IAsyncResult ar)44         {45             Socket listener = (Socket)ar.AsyncState;46             Socket socket = listener.EndAccept(ar);47            // Console.WriteLine("连接到windows phone 客户端");48             showMessage("连接到windows phone 客户端");49             _flipFlop.Set();50             var state = new StateObject();51             state.Socket = socket;52             socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, state);53         }54 55         private void ReceiveCallback(IAsyncResult ar)56         {57             StateObject state = (StateObject)ar.AsyncState;58             Socket socket = state.Socket;59             int read = socket.EndReceive(ar);60             if (read > 0)61             {62                 string chunk = Encoding.UTF8.GetString(state.Buffer, 0, read);63                 state.StringBuilder.Append(chunk);64                 if (state.StringBuilder.Length > 0)65                 {66                     string result = state.StringBuilder.ToString();67                   //  Console.WriteLine("收到客户端传来的消息:{0}", result);68                     control.Dispatcher(int.Parse(result));69                     //showMessage("收到客户端