谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目

583 篇文章 127 订阅
47 篇文章 38 订阅

项目介绍:

Java那边的同事的笔记本上的键盘坏了,他怀疑是有人动了他的电脑,但不知道是谁,身为C++程序员的我(虽然是个实习狗),但还是做出了一个小程序,当Windows唤醒和开机时,会自动拍照,看看是谁动了他的主机。


本次采用C/C++语言。Qt框架


程序运行截图如下:


为了方便操作我还做成了托盘程序:



当点击保存设置后,会把上面的两个ComBox的内容写入cfg.dat这个文件中,并且添加注册表,让其能够开机自启动



当睡眠或者开机时,会自动创建文件夹并且拍照:

如下图:


源码下载地址:

https://download.csdn.net/download/qq78442761/10453826

码云下载地址:

https://gitee.com/IT1995/hunter/tree/master


下面将对此程序的原理给出详细的说明

程序的关键:

一:当Windows睡眠的时候,程序是被“冻结”的,不会被运行,但有一个东西唤醒时会变动的,那就是系统时间。

所以实现功能的关键就是,在程序里面做一个计时器,这个计时器和系统时间做对比(运行的时候,这两个值是一样的)。

当唤醒后,他们之间会不一样,然后更具这个差值,如果满足某个条件,就拍照。

二:拍照的时候,一点要有“延时”,这个意思就是说。每次拍照之间要有时间间隔,关闭摄像头也要有,不然拍照是不会成功的。


上面的两点就是程序的关键。

下面说下技术上的细节。(所有源代码可以在上面的链接中下载);

程序结构如下图所示:



插入注册表:

void Widget::appAutoRun()
{
    QSettings reg("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);
    QString strAppPath=QDir::toNativeSeparators(QCoreApplication::applicationFilePath());
    reg.setValue("狩猎者",strAppPath);
}

判断是否要拍照:

void MyWorker::beginJudge()
{

    if(QDateTime::currentDateTime().toTime_t()-m_judNum<(uint)m_flexibleNum*10){
        //正常状态
        m_judNum=QDateTime::currentDateTime().toTime_t();
    }
    else{
        //可以拍照了
        emit takeAPicture();
    }
}


拍照时的细节(延时)

void MyWorker::ALLDelay()
{
    if(m_picNum>0){  //可以拍照了
        qDebug()<<"m_picNum>0";
        emit setPic(m_picNum);
    }
    else if(m_picNum>-1){   //关闭摄像头
        qDebug()<<"m_picNum>-1";
        emit closeCamera();
    }
    else if(m_picNum>-2){
        qDebug()<<"emit this->initAllData();";
        emit initAllData();
    }
    else{

    }
    m_picNum--;
}

创建文件并开始拍照:

void Widget::takeAPicture()
{
    qDebug()<<"开始拍照!";
    m_timer_1->stop();
    if(!m_timer_2)
        m_timer_2=new QTimer;

    m_savePath=qApp->applicationDirPath()+"/"+QString::number(QDateTime::currentDateTime().toTime_t());
    QDir dir(m_savePath);
    if(dir.exists()){
        //应该不可能有相同的文件夹
        Q_ASSERT(!"impossibility");
    }
    dir.mkdir(m_savePath);

    //开始拍照咯!
    m_camera=new QCamera(this);
    m_viewfinder=new QCameraViewfinder(this);
    m_imageCapture=new QCameraImageCapture(m_camera);
    m_camera->setViewfinder(m_viewfinder);
    m_camera->start();
    m_myWorker->setPicNum(ui->cameraCountComboBox->currentText().toInt());
    connect(m_timer_2,SIGNAL(timeout()),m_myWorker,SLOT(ALLDelay()));
    connect(m_myWorker,SIGNAL(setPic(int)),this,SLOT(takePic(int)));
    connect(m_myWorker,SIGNAL(closeCamera()),this,SLOT(closeCamera()));
    connect(m_myWorker,SIGNAL(initAllData()),this,SLOT(stopTimAndInit()));
    m_timer_2->start(1000);
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值