手机控制PPT good

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

#-------------------------------------------------
#
# Project created by QtCreator 2016-06-20T09:20:20
#
#-------------------------------------------------

QT       += core gui
QT += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Control_PPT
TEMPLATE = app

SOURCES += main.cpp        mainwidget.cpp

HEADERS  += 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_OBJECT

public:
    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 program

from socket import*
from time import ctime
import win32com.client
import win32api
import win32con
import time
import pythoncom
from 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 False
if __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 = tcpCliSock.recv(BUFSIZE).decode()
            print(data)
            if not data:
                break
            if ppt.hasActivePresentation():
                if data == "f5":
                    ppt.fullScreen()
                elif data == "up":
                    ppt.prePage()
                elif data == "down":
                    ppt.nextPage()
                elif data == "left":
                    ppt.prePage()
                elif data == "right":
                    ppt.nextPage()
                elif data == "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

时间: 2024-10-13 16:23:25

手机控制PPT good的相关文章

“小懒虫”安卓手机控制电脑关机

背景 好多次晚上,躺在床上听着电脑放的音乐休息,听着听着眼睛睁不开,睡意涌上来,往往这时候我实在是不舍得起来关灯,关电脑,因为起来了很可能浓浓的睡意就没有了,又有精神了,所以就想着写个东西能用手机控制把灯和电脑关掉.今天上海的天气很热,看书实在是看不下去,敲敲程序吧,然后就有了"小懒虫". 解决方案 写这个软件的时候,想着两种解决方案,如下图 之所以有方案2,是我当时想不到怎么用手机APP获取到运行在电脑的服务端的IP,总不能我起床看看服务端IP是多少,然后再输入IP关机吧,那样的话我

手机控制电脑,在WIFI局域网下(关机,重启,遥控)

这个软件叫百变遥控:http://blog.sina.com.cn/s/blog_9abc7dbc0101hmut.html 今天周末,在家里看电影,家里用的是台式电脑,我自己买了一个投影仪来专门看视频节目的,因为投影仪是和电脑连接的,所以每次换集啊,想快进啊,就非常不方便,得跑去操作电脑,天冷啊,躺在床上不想动啊,所以想能用手机来操作电脑,于是在网上找了找. 我以前是用的TeamViewer和花生壳来远程控制我的公司里的办公电脑的,但这两个玩意有个问题,它们是需要通过这两个软件的中央服务器来转

手机控制电脑定时关机,重启WiFi

需求 晚上上床,电脑开着WiFi让手机上网.要么上床之前就给电脑设置定时关机:要么就电脑开通宵:要么就待会下来关电脑.这3种情况都非常不好,要么麻烦,要么浪费. 最无奈的是电脑刚开好WiFi,上床后才发现,手机虽然连上了WiFi,但是不能上网.于是蛋疼的从床上爬下来重启WiFi. 昨晚突发奇想如果能够在床上用手机控制电脑定时关机该多好.刚好今天凌晨咳嗽到睡不着,干脆起来实现它. 想法 因为电脑和手机在以上2种情况都是连通的,所以手机可以轻松访问电脑,那么就要把电脑部署成服务器. 然后让手机以网页

触控鼠标 (使用手机控制电脑,支持IOS,android.OSx 和windows)进入初步推广阶段

这款应用主要是用于使用手机控制电脑,几乎涉猎全平台(android 和 ios,windows 和os x),其实在1个月之前已经上线了,一直也比较忙,也就没有对这个应用进行一个系统的介绍和推广,今天就先写篇博文对这款应用进行一下系统的介绍和推广.从开始有一个开发自己的app 到有了这个开发思路,再到最后的app store 上线大概用了2个半月吧.因为是个人开发所以大部分都是用晚上和周末的时间做的,所以开发周期也就比较长点了. 从网站,到电脑服务端再到android 和iphone 手机端,完

蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现

虽然蓝牙4.0 BLE芯片CC2540 是单芯片(即用户可以对它进行芯片级代码编写), 是8051增强型主控, 带蓝牙4.0功能, 但很多时候很多客户都只需要他的透传功能, 现在随着Android4.3 和IOS 的兴起, 支持蓝牙4.0BLE的手机越来越多,所以如何实现手机控制CC2540的透传是一个非常实用的功能,有了这个功能, 我们可以用手机来连接CC2540通过串口来连接的设备,纵观淘宝上有销售的几种模块, 小部分研发实力不足的,都只是提供裸模块,有两家提供了串口透传的模块的, 售价比裸

wake up on lan 安卓手机控制局域网唤醒开机+远程关机

1.bios 开启远程唤醒,具体自行百度(Power On by PCIE devices 与 Power On by Onboard )2.记录MAC地址3.手机装软件 ,看好图上的字 安卓手机控制端(小米6开发版亲测可用)下载地址:https://www.7down.com/soft/163710.html 手机上我装的是remote desktop manager超专业的,自行百度手机版 局域网远程控制 关机是个事,有这个轻松解决 电脑关机软件(win7亲测可用,双击就关机)下载地址:ht

C# winform以阅览模式打开PPT,并控制PPT上下页,轮播

[DllImport("user32.dll")] public extern static int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); /// <summary> /// 打开ppt文件 /// </summary> /// <param name="filePath">路径</param> /// <return

我的Android进阶之旅------&gt;Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端

因为经常开着笔记本工作,累了就坐床上玩手机,但晚上要睡觉了又不想下床去关电脑,就想做个Android软件来控制PC端的关机和重启.要想实现此功能,就得让Android手机和PC之间进行通信才能,因此采用Socket编程来实现. ==================================Shutdown命令的用法======================================== 首先得了解一下关于Shutdown命令的用法. 选择win+R,打开命令行窗口,输入shutdo

手机控制ubuntu电脑

前言. 公司的电脑是ubuntu的,由于晚上周末经常会出现一些紧急事情,或者编译的时候想排错,那意味着就必须去公司才能解决该问题.当然如果离家很近,那过来很方便,如果很远呢?所以远程控制公司的ubuntu电脑就显得尤其重要了. 一.安装XT800 1.android或者iphone手机安装XT800客户端 2.由于目前在ubuntu上暂时没有XT800,所以需要安装在虚拟机windows xp下面. 以上2步应该是不会出现什么问题的,然后就可以首先控制xp的虚拟机了. 二.控制ubuntu 最重