谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目
項(xiàng)目介紹:
Java那邊的同事的筆記本上的鍵盤壞了,他懷疑是有人動(dòng)了他的電腦,但不知道是誰(shuí),身為C++程序員的我(雖然是個(gè)實(shí)習(xí)狗),但還是做出了一個(gè)小程序,當(dāng)Windows喚醒和開機(jī)時(shí),會(huì)自動(dòng)拍照,看看是誰(shuí)動(dòng)了他的主機(jī)。
本次采用C/C++語(yǔ)言。Qt框架
程序運(yùn)行截圖如下:
為了方便操作我還做成了托盤程序:
當(dāng)點(diǎn)擊保存設(shè)置后,會(huì)把上面的兩個(gè)ComBox的內(nèi)容寫入cfg.dat這個(gè)文件中,并且添加注冊(cè)表,讓其能夠開機(jī)自啟動(dòng)
當(dāng)睡眠或者開機(jī)時(shí),會(huì)自動(dòng)創(chuàng)建文件夾并且拍照:
如下圖:
源碼下載地址:
https://download.csdn.net/download/qq78442761/10453826
碼云下載地址:
https://gitee.com/IT1995/hunter/tree/master
下面將對(duì)此程序的原理給出詳細(xì)的說(shuō)明
程序的關(guān)鍵:
一:當(dāng)Windows睡眠的時(shí)候,程序是被“凍結(jié)”的,不會(huì)被運(yùn)行,但有一個(gè)東西喚醒時(shí)會(huì)變動(dòng)的,那就是系統(tǒng)時(shí)間。
所以實(shí)現(xiàn)功能的關(guān)鍵就是,在程序里面做一個(gè)計(jì)時(shí)器,這個(gè)計(jì)時(shí)器和系統(tǒng)時(shí)間做對(duì)比(運(yùn)行的時(shí)候,這兩個(gè)值是一樣的)。
當(dāng)喚醒后,他們之間會(huì)不一樣,然后更具這個(gè)差值,如果滿足某個(gè)條件,就拍照。
二:拍照的時(shí)候,一點(diǎn)要有“延時(shí)”,這個(gè)意思就是說(shuō)。每次拍照之間要有時(shí)間間隔,關(guān)閉攝像頭也要有,不然拍照是不會(huì)成功的。
上面的兩點(diǎn)就是程序的關(guān)鍵。
下面說(shuō)下技術(shù)上的細(xì)節(jié)。(所有源代碼可以在上面的鏈接中下載);
程序結(jié)構(gòu)如下圖所示:
插入注冊(cè)表:
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){//正常狀態(tài)m_judNum=QDateTime::currentDateTime().toTime_t();}else{//可以拍照了emit takeAPicture();} }拍照時(shí)的細(xì)節(jié)(延時(shí))
void MyWorker::ALLDelay() {if(m_picNum>0){ //可以拍照了qDebug()<<"m_picNum>0";emit setPic(m_picNum);}else if(m_picNum>-1){ //關(guān)閉攝像頭qDebug()<<"m_picNum>-1";emit closeCamera();}else if(m_picNum>-2){qDebug()<<"emit this->initAllData();";emit initAllData();}else{}m_picNum--; }創(chuàng)建文件并開始拍照:
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()){//應(yīng)該不可能有相同的文件夾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); }總結(jié)
以上是生活随笔為你收集整理的谁动了你的主机-Windows“唤醒”和“开机”时自动拍照-狩猎者项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-UDP多线程数据处理及发送
- 下一篇: Qt文档阅读笔记|Qt工作笔记-QMut