大致思路爲安卓客戶端獲取當前點擊的座標,算出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);
//}