首页 > 代码库 > 手机控制PPT good

手机控制PPT good

以前做了一个小东西,通过手机来控制PPT的翻页,最大化和最小化,东西很简单,近期整理电脑发现了拿来和大家分享一下 
主要分为两个部分,客户端和服务器 
客户端实现 
当初考虑到跨平台的特性就选择了qt来写的,代码很简单,主要是通过socket连接运行在电脑上的server,发送不同的指令完成不同的操作。由于Qt的跨平台性可以将其移植到安卓和iOS上,安卓上使用完全没问题,ios也应该是没问题,我不是土豪,没法用苹果手机测试,有兴趣的大家可以试试 
Control_PPT.pro

#-------------------------------------------------## Project created by QtCreator 2016-06-20T09:20:20##-------------------------------------------------QT       += core guiQT += networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = Control_PPTTEMPLATE = appSOURCES += main.cpp        mainwidget.cppHEADERS  += mainwidget.h

mainwidget.h

#ifndef MAINWIDGET_H#define MAINWIDGET_H#include <QWidget>#include <QtNetwork/QtNetwork>#include <QLabel>#include <QPushButton>#include <QLineEdit>#include <QVBoxLayout>#include <QHBoxLayout>#include <QGridLayout>#include <QMessageBox>#include <QMouseEvent>#include <QStatusBar>class MainWidget : public QWidget{    Q_OBJECTpublic:    MainWidget(QWidget *parent = 0);    ~MainWidget();    void initIpLayout();    void initControlBtnLayout();//    void mouseMoveEvent(QMouseEvent *event);private:    QLabel *ipLbl;    QLineEdit *ipLineEdit;    QPushButton *connectBtn;    /*    控制按钮  上一页、写一页等    */    QPushButton *upBtn;    QPushButton *downBtn;    QPushButton *leftBtn;    QPushButton *rightBtn;    QPushButton *f5Btn;    QPushButton *escBtn;    /*    布局    */    QHBoxLayout *ipHLayout;    QGridLayout *controlBtnLayout;    QVBoxLayout *mainVLayout;    QTcpSocket *client;    QStatusBar *statusBar;    QLabel *msgLabel;    bool flag;public slots:    void conncSlot();    void upSlot();    void downSlot();    void leftSlot();    void rightSlot();    void f5Slot();    void escSlot();    void displayError(QAbstractSocket::SocketError);};#endif // MAINWIDGET_H

main.widget.cpp

#include "mainwidget.h"MainWidget::MainWidget(QWidget *parent)    : QWidget(parent){    flag = true;    msgLabel = new QLabel;    //msgLabel->setMinimumSize(msgLabel->sizeHint());    msgLabel->setAlignment(Qt::AlignHCenter);    statusBar = new QStatusBar(this);    statusBar->setFixedHeight(30);    statusBar->setFixedWidth(this->width());    statusBar->addWidget(msgLabel); //头文件要添加include<QStatusBar>才不会报错    initIpLayout();    initControlBtnLayout();    mainVLayout = new QVBoxLayout;    mainVLayout->addLayout(ipHLayout);    mainVLayout->addLayout(controlBtnLayout);    this->setLayout(mainVLayout);    connect(connectBtn,SIGNAL(clicked()),this, SLOT(conncSlot()));    connect(upBtn,SIGNAL(clicked()),this, SLOT(upSlot()));    connect(downBtn,SIGNAL(clicked()),this, SLOT(downSlot()));    connect(f5Btn,SIGNAL(clicked()),this, SLOT(f5Slot()));    connect(leftBtn,SIGNAL(clicked()),this, SLOT(leftSlot()));    connect(rightBtn,SIGNAL(clicked()),this, SLOT(rightSlot()));    connect(escBtn,SIGNAL(clicked()),this, SLOT(escSlot()));}/*    设置获取ip连接的布局*/void MainWidget::initIpLayout(){    ipLbl = new QLabel(tr("IP:"));    ipLineEdit = new QLineEdit();    ipLineEdit->setPlaceholderText(tr("127.0.0.1"));    connectBtn = new QPushButton(tr("连接"));    ipHLayout = new QHBoxLayout;    ipHLayout->addWidget(ipLbl);    ipHLayout->addWidget(ipLineEdit);    ipHLayout->addWidget(connectBtn);//    ipHLayout->setMargin(10);}void MainWidget::initControlBtnLayout(){    upBtn = new QPushButton(tr("上"));    leftBtn = new QPushButton(tr("左"));    f5Btn = new QPushButton(tr("f5"));    rightBtn = new QPushButton(tr("右"));    downBtn = new QPushButton(tr("下"));    escBtn = new QPushButton(tr("esc"));    controlBtnLayout = new QGridLayout();    controlBtnLayout->addWidget(upBtn,0,1);    controlBtnLayout->addWidget(leftBtn, 1, 0);    controlBtnLayout->addWidget(f5Btn,1,1);    controlBtnLayout->addWidget(rightBtn, 1, 2);    controlBtnLayout->addWidget(downBtn, 2, 1);    controlBtnLayout->addWidget(escBtn, 3, 1);}//void MainWidget::mouseMoveEvent(QMouseEvent *event)//{//    int x = event->x();//    int y = event->y();//    QPoint point = cursor().pos();//    int x = point.x();//    int y = point.y();//    QString xy;//    xy.clear();//    xy = tr("%1%2%3").arg(x).arg("#").arg(y);//    qDebug() << xy;//    char* chxy;//    QByteArray ba = xy.toLatin1();//    chxy=ba.data();//    if(flag)//        client->write(chxy);//}void MainWidget::displayError(QAbstractSocket::SocketError){    flag = false;    qDebug() << client->errorString(); //输出错误信息}void MainWidget::conncSlot(){    QString ip = ipLineEdit->text();    QString pattern("^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])[.](\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])[.](\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])[.](\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$");    QRegExp rx(pattern);    if(ip.isEmpty())    {        QMessageBox::information(this,"请输入IP","请输入服务器的IP地址!");        return ;    }    else if(!(rx.exactMatch(ip)))    {        QMessageBox::information(this,"格式错误","请输入正确的IP地址!");        return ;    }    client = new QTcpSocket(this);    client->connectToHost(QHostAddress(ip), 5588);    //connect(client, SIGNAL(connected()),this, SLOT(is_connect_ok()));    connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));    if(flag)    {        msgLabel->setText(tr("连接成功!"));        QMessageBox::information(this,tr("连接提示"),tr("恭喜你连接成功"));        flag = false;    }    else    {        msgLabel->setText(tr("连接失败!"));        QMessageBox::information(this,tr("连接提示"),tr("连接失败,请检查ip是否正确"));    }    ipLineEdit->clear();}void MainWidget::escSlot(){    client->write("esc");    msgLabel->setText(tr("退出全屏显示"));    //client->write("100#100");}void MainWidget::upSlot(){    client->write("up");    msgLabel->setText(tr("上一页!"));}void MainWidget::downSlot(){    msgLabel->setText(tr("下一页!"));    client->write("down");}void MainWidget::leftSlot(){    msgLabel->setText(tr("上一页!"));    client->write("left");}void MainWidget::rightSlot(){    msgLabel->setText(tr("下一页!"));    client->write("right");}void MainWidget::f5Slot(){    msgLabel->setText(tr("全屏显示!"));    client->write("f5");}MainWidget::~MainWidget(){}

main.cpp

#include "mainwidget.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWidget w;    w.show();    return a.exec();}

服务器端 
服务器端是Python写的,当然用c++也是可以的,考虑到代码的简洁就选择了python,正好当时刚学了几点的python就用了它,代码写的很烂。服务器的作用主要是调用微软提供的PPT接口完成操作。 
server.py

# Echo server programfrom socket import*from time import ctimeimport win32com.clientimport win32apiimport win32conimport timeimport pythoncomfrom ctypes import *class PowerPointControler:    def __init__(self):        pythoncom.CoInitialize()        self.app = win32com.client.Dispatch("PowerPoint.Application")    def fullScreen(self):        #全屏播放        if self.hasActivePresentation():            #使用Run方法创建一个新的幻灯片放映窗口并将其添加到SlideShowWindows集合            self.app.ActivePresentation.SlideShowSettings.Run()#该方法用于运行指定演示文稿的幻灯片放映。            return self.getActivePresentationSlideIndex()    def closeFull(self):#结束第一个幻灯片放映窗口中的幻灯片放映        if self.app.ActivePresentation.SlideShowSettings.Run():            self.app.SlideShowWindows(1).View.Exit()    def gotoSlide(self,index):        #跳转到指定的页面        if self.hasActivePresentation():                try:                    self.app.ActiveWindow.View.GotoSlide(index)                    return self.app.ActiveWindow.View.Slide.SlideIndex                except:                    self.app.SlideShowWindows(1).View.GotoSlide(index)                    return self.app.SlideShowWindows(1).View.CurrentShowPosition    def nextPage(self):#下一页ppt        if self.hasActivePresentation():            count = self.getActivePresentationSlideCount()            index = self.getActivePresentationSlideIndex()            return count if index >= count else self.gotoSlide(index+1)    def prePage(self):#上一页ppt        if self.hasActivePresentation():            index =  self.getActivePresentationSlideIndex()            return index if index <= 1 else self.gotoSlide(index-1)    def drawLine(self, x, y):        index =  self.getActivePresentationSlideIndex()        windll.user32.SetCursorPos(x, y)        #参数1位x的起点  第二个参数是y的起点   这两个参数决定了起始的位置        #参数3是x的终点位置      第四个参数是 y的终点位置        self.app.SlideShowWindows(index).View.DrawLine(x, y, x + 500, y)    def getActivePresentationSlideIndex(self):        #得到活跃状态的PPT当前的页数        if self.hasActivePresentation():            try:                index = self.app.ActiveWindow.View.Slide.SlideIndex            except:                index = self.app.SlideShowWindows(1).View.CurrentShowPosition        return index    def getActivePresentationSlideCount(self):        #返回处于活跃状态的PPT的页面总数        return self.app.ActivePresentation.Slides.Count    def getPresentationCount(self):        #返回打开的PPT数目        return self.app.Presentations.Count    def hasActivePresentation(self):        #判断是否有打开PPT文件        return True if self.getPresentationCount() > 0 else Falseif __name__ == ‘__main__‘:    HOST = ‘‘                     PORT = 5588                  BUFSIZE = 1024    ADDR = (HOST, PORT)    tcpSerSock = socket(AF_INET, SOCK_STREAM)    tcpSerSock.bind(ADDR)    tcpSerSock.listen(5)    ppt = PowerPointControler()    while True:        print(‘waiting for connection...‘)        tcpCliSock, addr = tcpSerSock.accept()        print(‘...connected from:‘, addr)        while True:            data = http://www.mamicode.com/tcpCliSock.recv(BUFSIZE).decode()"hljs-keyword">if not data:                break            if ppt.hasActivePresentation():                if data =http://www.mamicode.com/= "f5":                    ppt.fullScreen()                elif data =http://www.mamicode.com/= "up":                    ppt.prePage()                elif data =http://www.mamicode.com/= "down":                    ppt.nextPage()                elif data =http://www.mamicode.com/= "left":                    ppt.prePage()                elif data =http://www.mamicode.com/= "right":                    ppt.nextPage()                elif data =http://www.mamicode.com/= "esc":                    ppt.closeFull()                #else:未完成画线操作,只能话简单的直线                    #xy = data.split(‘#‘)                    #print(xy[0],xy[1])                    #ppt.drawLine(int(xy[0]), int(xy[1]))                    #xy.clear();            else:                tcpCliSock.send("close")    tcpCliSock.close()    tcpSerSock.close()

吾还年轻,写的代码比较烂,希望大家指正。 
项目下载地址:https://github.com/gqqcode/Mobile-phone-control-ppt

 

http://blog.csdn.net/guoqianqian5812/article/details/52627502

手机控制PPT good