大致思路为安卓客户端获取当前点击的坐标,算出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);
//}