谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目
Posted IT1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目相关的知识,希望对你有一定的参考价值。
项目介绍:
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);
以上是关于谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目的主要内容,如果未能解决你的问题,请参考以下文章