谁动了你的主机-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“唤醒”和“开机”时自动拍照-狩猎者项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-UDP多线程数据处理及发送
- 下一篇: Qt文档阅读笔记|Qt工作笔记-QMut