【原创】WIFI手机实现的PPT翻页器(1b)——PC端(Python实现)
近来智能手机非常流行,一个很久以前的idea在我的脑海里复活——用手机代替现有的PPT翻页器。众所周知,售前人员在给客户讲解PPT时,经常需要远离自己的电脑而走近投影屏幕。这时候讲解就需要用到无线翻页器。因此翻页器(Wireless Presenter)作为一款产品就开始热销了。我是没钱买的,不过既然我们的手机支持编程,支持WIFI,那为什么不自己DIY一个翻页器呢?Let’s Go!
WIFI手机PPT翻页器的原理很简单:手机上的客户端通过无线网络向PC上的服务端发送翻页命令,PC上的服务器程序根据命令,在当前正在播放的PPT幻灯片上模拟键盘操作。
今天先来介绍服务端的实现,该服务端程序我使用了Python2.6进行开发。程序流程基本如下:
1、启动后程序监听本地指定端口(默认80);
2、当有客户端连接监听端口并发送了指令则执行翻页操作;
3、翻页前通过枚举窗口找到PowerPoint幻灯片播放窗口;
4、程序将该窗口置顶(实际该步骤未实现),并执行相关键盘操作。如:向下翻页(N)、向前翻页(P)、首页(Home)、尾页(End)、退出(ESC)等;
5、程序循环运行。
关键技术:
1.WxPython编程
2.Python调用Win32API
3.Win32API枚举窗口、模拟键盘
5.Python Socket编程
5.Python 多线程使用
PPTP_Server.pyw代码如下:
?Download download.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #!D:/Python26/python.exe # -*- coding:cp936 -*- import socket import sys import wx import win32api import win32ui import win32gui import SocketServer import threading class MyHandler(SocketServer.BaseRequestHandler): def _my_callback(self,hwnd, extra): caption=win32gui.GetWindowText(hwnd) if caption.find('PowerPoint 幻灯片放映')!=-1: #win32gui.SetWindowText(hwnd, 'Powered by - Mozilla Firefox') windowTitle = win32gui.GetWindowText(hwnd) print windowTitle self.pptWindow = win32ui.FindWindow(None, windowTitle) def ppt_sendkey(self, key): if None == self.pptWindow: print "找不到正在播放的幻灯片" return False #win32gui.SetForegroundWindow(self.pptWindow) #如何激活PowerPoint的子窗口? print "Ready to SendKeys!!!" print self.pptWindow,type(self.pptWindow) win32api.Sleep(500) # 给个延时,用于窗口置顶后程序反应的延迟 win32api.keybd_event(key, 0, ) def enumWindows(self): win32gui.EnumWindows(self._my_callback, ()) def ppt_process(self,cmd):#解析远程命令:上翻和下翻 #print cmd if -1 != cmd.find("DOWN"): self.ppt_sendkey(0x4e) # 'N' if -1 != cmd.find("UP"): self.ppt_sendkey(0x50) # 'P' if -1 != cmd.find("BLACK"): self.ppt_sendkey(0x42) # 'B' if -1 != cmd.find("WHITE"): self.ppt_sendkey(0x57) # 'W' if -1 != cmd.find("HOME"): self.ppt_sendkey(0x24) # 'HOME' if -1 != cmd.find("END"): self.ppt_sendkey(0x23) # 'END' if -1 != cmd.find("QUIT"): self.ppt_sendkey(0x1B) # 'ESC' def printsocket(self): self.pptWindow = None self.enumWindows() def finish(self): self.request.close() def handle(self): self.printsocket() while 1: dataReceived = None dataReceived = self.request.recv(10) print dataReceived if not dataReceived: self.printsocket() break else: self.ppt_process(dataReceived) class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "WiFi手机PPT翻页器", size = (300, 100)) self.panel = wx.Panel(self, -1) self.sizer = wx.BoxSizer(wx.HORIZONTAL) self.panel.SetSizer(self.sizer) self.txt = wx.StaticText(self.panel, -1, "监听端口:") self.inputText = wx.TextCtrl(self.panel, -1, "80") self.button = wx.Button(self.panel, -1, "开始") self.Bind(wx.EVT_BUTTON, self.OnStart, self.button) self.button.SetDefault() self.sizer.Add(self.txt, 0, wx.TOP|wx.LEFT, 10) self.sizer.Add(self.inputText, 0, wx.TOP|wx.LEFT, 10) self.sizer.Add(self.button, 0, wx.TOP|wx.LEFT, 10) self.Centre() def OnStart(self, event): self.port = int(self.inputText.GetValue()) wx.MessageBox("可以播放PPT幻灯片了:)", "注意") th = threading.Thread(target=self.ppt_receiver,args=()) th.start() def ppt_receiver(self):#启动监听器,等待命令 myServer = SocketServer.ThreadingTCPServer(('0.0.0.0',self.port), MyHandler) myServer.serve_forever() if __name__ == "__main__": myApp = wx.PySimpleApp() MyFrame().Show() myApp.MainLoop() |
