QT FOR 安卓鼠標控制電腦

    大致思路爲安卓客戶端獲取當前點擊的座標,算出x y之後除以當前屏幕最大分辨率得出百分比,把百分比發到電腦端(UDP or TCP,此處用的UDP),乘以電腦的最大分辨率,在轉換爲座標,使用windows api mouse_event 觸發移動,和點擊消息。

    本示例只提供了鼠標座標移動和單擊出發,如果要加按住拖動效果的話加上mouseMoveevent即可,這裏就不再闡述了。

    

發送端:(手機端)

    Pro文件裏 += network

    頭文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtNetwork/QtNetwork>
#include <QDesktopWidget>
#include <QMouseEvent>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    ///
    QUdpSocket *sender;
private:
    Ui::MainWindow *ui;
protected:
    void mousePressEvent(QMouseEvent *e);       //--鼠標按下事件

};

#endif // MAINWINDOW_H



    cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    sender = new QUdpSocket(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::mousePressEvent(QMouseEvent *e)
{
    QRect screenrect;
    QDesktopWidget* desktopWidget = QApplication::desktop();//獲取分辨率
    screenrect = desktopWidget->screenGeometry();
    //UDP廣播
   
    if (e->button()==Qt::LeftButton)
    {
        QPoint point;
        point=QCursor::pos();//獲取當前點擊的座標
        ui->label_2->setText(QString::number(point.x(),10));
        ui->label_3->setText(QString::number(point.y(),10));
        float Xpercent=(float)point.x()/screenrect.width();//算出百分百比
        float Ypercent=(float)point.y()/screenrect.bottom();
        QString savepoint;
        savepoint=QString("%1").arg(Xpercent);
        savepoint+="-";
        savepoint+=QString("%1").arg(Ypercent);
         QByteArray datagram;
        datagram=savepoint.toLatin1();//轉爲QByteArray
    }
    sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,8000);//廣播,端口8000

    //QHostAddress serverAddress = QHostAddress("192.168.1.172");//特定IP
    //sender->writeDatagram(datagram.data(), datagram.size(),serverAddress, 8000);

    /* writeDatagram函數原型,發送成功返回字節數,否則-1
        qint64 writeDatagram(const char *data,qint64 size,const QHostAddress &address,quint16 port)
        qint64 writeDatagram(const QByteArray &datagram,const QHostAddress &host,quint16 port)
    */

}






接收端:

    頭文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QLabel>
#include <QStatusBar>
#include <QTextCodec>
#include <QtNetwork/QtNetwork>
#include <QMouseEvent>
#include<QCursor>
#include<windows.h>
#include<QDesktopWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
public:
    QUdpSocket *receiver;
    QString ipadd;
    void GetLocalIpv4();
private slots:
    void readPendingDatagrams();

};

#endif // MAINWINDOW_H


    cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);       
    MainWindow::GetLocalIpv4();//ipadd爲ipv4地址
    receiver = new QUdpSocket(this);
    receiver->bind(QHostAddress(ipadd), 8000);
    connect(receiver, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::readPendingDatagrams()
 {

        QByteArray datagram;
        datagram.resize(receiver->pendingDatagramSize());
        receiver->readDatagram(datagram.data(), datagram.size());
        ui->textBrowser->append(datagram);
        QString Percent=datagram;
        QString percentX,percentY;
        int check=0;

        for(int a=0;a<Percent.length();a++)
       {
            if(Percent.at(a)=="-")
               {
                check=1;
                continue;
                }

            if(check==0)
            {
                percentX+=Percent.at(a);
            }
            else
            {
                percentY+=Percent.at(a);
            }

       }

        QRect screenrect;
        QDesktopWidget* desktopWidget = QApplication::desktop();//獲取分辨率
        screenrect = desktopWidget->screenGeometry();
        int x,y;
        x=percentX.toFloat()*screenrect.width();
        y=percentY.toFloat()*screenrect.height();
        mouse_event ( MOUSEEVENTF_ABSOLUTE  | MOUSEEVENTF_MOVE ,x*65532/screenrect.width(), y*65532/screenrect.height(), 0, 0) ; //絕對座標移動
        mouse_event ( MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );//單擊

        //數據接收在datagram裏
        /* readDatagram 函數原型
            qint64 readDatagram(char *data,qint64 maxSize,QHostAddress *address=0,quint16 *port=0)
        */

 }

void MainWindow::GetLocalIpv4()
{
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    foreach (QHostAddress address, list)
    {
        if(address.protocol() == QAbstractSocket::IPv4Protocol)
        {
            //IPv4地址
            if (address.toString().contains("127.0."))
            {
                continue;
            }
            ipadd = address.toString();
        }
    }
    if ( ipadd == "127.0.0.1")
    {
      //QMessageBox::information(this,"message","獲取地址失敗");
        return;
    }
    else
    {
     // QMessageBox::information(this,"message","獲取地址成功");
    }

}











//mouse_event ( MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );//單擊
//mouse_event ( MOUSEEVENTF_ABSOLUTE  | MOUSEEVENTF_MOVE , a*65532/1440, b*65532/900, 0, 0) ; //絕對座標移動

//void MainWindow::on_pushButton_clicked()
//{
//            QPoint point;
//            point=QCursor::pos();
//            QString x,y;
//            x=QString::number(point.x(),10);
//            y=QString::number(point.y(),10);
//            ui->textBrowser->append(x);
//            ui->textBrowser->append("---");
//            ui->textBrowser->append(y);
//}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章