Laien's

成功 自在 健康 好状态

【原创】WIFI手机实现的PPT翻页器(1b)——PC端(Python实现)

without comments

  近来智能手机非常流行,一个很久以前的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()

服务端运行后效果图:

Written by Laien

February 23rd, 2010 at 4:57 pm

Posted in Programming, Python