前言
最近发现,我浪费的时间很多,每天的日常就是:
每次打开带电脑之后都是玩手机,基本不会去使用电脑学习,所以我决定监视一下自己一天之中使用电脑的时间。
实现思路
通过记录鼠标的运动
以及键盘的输入
来判断是否正在使用电脑:
- 每过一分钟检测一下鼠标的位置,如果鼠标的位置改变了,那么就判定为正在使用电脑,则时间就增加一分钟。
- 在一分钟之内的每一秒钟不断检测
鼠标的点击
或者键盘的输入
,如果出现以上两种情况,那么就直接等待一分钟的计时结束,可以节约CPU
的资源。设置为一分钟的每秒检测,而不是一直检测也是为了防止不断循环而导致占用CPU
的资源。
每次运行都会将电脑的使用时间实时记录下来,保存在txt
文件中。
最后将程序设置为开机自启。
代码
#include "stdio.h"
#include <iostream>
#include <windows.h>
#include <time.h>
#include <string>
#include <fstream>
using namespace std;
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? true : false)
int main()
{
POINT p;
POINT last_p;
// 定义总的学习时间:以分钟为单位
int study_time = 0;
time_t timePointer;
time(&timePointer);
char temp[64];
// 将时间转化为年月日时分秒的格式
strftime(temp, sizeof(temp), "%Y%m%d_%H%M%S", localtime(&timePointer));
// 记录时间的文件
string record_txt = (string)temp + ".txt";
ofstream outfile(record_txt);
if (!outfile)
{
cout << "filed to open file\n";
exit(1);
}
while (true)
{
time_t timePointer;
time(&timePointer);
char temp[64];
strftime(temp, sizeof(temp), "%Y-%m-%d %H:%M:%S", localtime(&timePointer));
GetCursorPos(&last_p); //获取鼠标起始坐标
time_t now, later;
time(&now);
time(&later);
bool keyboard = false;
bool mouse = false;
// 每60秒检测一次
while (later - now < 60)
{
// 检测鼠标位置
GetCursorPos(&p); //获取鼠标结束坐标
if (!(p.x == last_p.x && p.y == last_p.y))
mouse = true;
// 检测键盘输入
for (int i = 1; i < 255; i++)
{
if (KEY_DOWN(i))
{
keyboard = true;
break;
}
}
if (keyboard || mouse)
Sleep(1000 * (59 + now - later));
Sleep(1000);
time(&later);
}
if (mouse || keyboard)
{
study_time++;
}
outfile << (string)temp << " ";
outfile << study_time << "mins" << endl;
}
outfile.close();
return 0;
}
结果
可以看到上面记录了每个时间。
开机自启
- 创建一个文件,
start.bat
:
# /b是执行起来没有小黑框
start /b D:\VScode\PY\myself\study_time.exe
- 在
start.bat
相同的目录下创建一个文件,start.vbs
:
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c start.bat",0
右击start.vbs
,创建快捷方式。
3. 按下Win+R
,输入shell:startup
,将前面的start.vbs快捷方式
移动到此目录下。
4. 完成!!!