From 9eb637e927894383560bb3db11b02f720573e183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=83=E5=B6=82=E5=A4=B9=E5=9F=8E?= Date: Sun, 22 Jun 2025 15:11:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7=EF=BC=8C=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E9=81=BF=E5=85=8D=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=8D=A1bug=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- selfMonitor.cpp | 257 +++++++++++++++++++++++++++++------------------- template.env | 2 + 3 files changed, 163 insertions(+), 101 deletions(-) create mode 100644 template.env diff --git a/.gitignore b/.gitignore index 9d830a9..f3402c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .vscode/ *.exe -*.txt \ No newline at end of file +*.txt +.env +*.bak +*.log \ No newline at end of file diff --git a/selfMonitor.cpp b/selfMonitor.cpp index b752417..f4a12d1 100644 --- a/selfMonitor.cpp +++ b/selfMonitor.cpp @@ -3,14 +3,35 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include +#include using namespace std; -// 黑名单 -const int BLACK_LIST_SIZE = 3; -string blackList[]={"哔哩哔哩","MuMu模拟器","知乎"}; -int blackListTimeCount = 0; -const int MAX_BLACKLIST_TIME_COUNT = 1800; -const int TOLENT_MORE_TIME = 1200; + +ofstream logFile; // 日志文件 +vector blackList; // 黑名单 +int blackListTimeCount = 0; // 黑名单时间计数 +const int MAX_BLACKLIST_TIME_COUNT = 1800; // 黑名单最大时间 +const int TOLENT_MORE_TIME = 1200; // 超出黑名单时间后,多长时间禁止摸鱼 +const int PUNISH_CLICKS = 20; // 连续点击次数超过多少次后允许继续 +const int PUNISH_CLICKS_RND = 10; // 连续点击次数向上飘逸上限 + +// 从字符串中读取黑名单 +void getBlackList(string str){ + if(str.substr(0, 10)!="BLACK_LIST") return; + str = str.substr(str.find("=")+1); + stringstream ss(str); string item; + while(ss>>quoted(item)){ + if(item==",") continue; + blackList.push_back(item); + } +} +// 保存黑名单时间 void saveData(){ // 保存黑名单时间到save.txt FILE *fp = fopen("save.txt", "w"); @@ -25,24 +46,8 @@ void saveData(){ fclose(fp); } } -bool beginWithMuteFlag=false; -void muteAll(){ - keybd_event(VK_SPACE, 0, 0, 0); - Sleep(1); - keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0); -} -void unmuteAll(){ - keybd_event(VK_SPACE, 0, 0, 0); - Sleep(1); - keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0); -} -int main(){ - ShowWindow(GetConsoleWindow(), SW_HIDE); - system("chcp 936 >>nul"); - FreeConsole(); - srand((unsigned)time(0)); - char title[1024]; - // 从save.txt中读取黑名单时间 +// 加载黑名单时间 +void loadData(){ FILE *fp = fopen("save.txt", "r"); if(fp!=NULL){ int curYear,curMonth,curDay; @@ -58,87 +63,139 @@ int main(){ } fclose(fp); } - cout<<"Hello, Self Monitor!"; +} +// 获取当前时间字符串 +string getTimeStr(){ + time_t now = time(0); + tm *ltm = localtime(&now); + char timeStr[1024]; + strftime(timeStr, sizeof(timeStr), "[%Y-%m-%d %H:%M:%S]", ltm); + return (string)timeStr; +} +// 初始化程序 +void initMonitor(){ + ShowWindow(GetConsoleWindow(), SW_HIDE); // 隐藏控制台窗口 + system("chcp 936 >>nul"); // 设置编码为GBK + FreeConsole(); // 隐藏控制台窗口 + srand((unsigned)time(0)); // 初始化随机数种子 + logFile.open("selfMonitor.log", ios::out); // 打开日志文件 + ifstream ifs(".env"); + if(ifs.is_open()){ + string line; + while(getline(ifs, line)) + getBlackList(line); + ifs.close(); + } + loadData(); + logFile<tm_hour==4&<m->tm_min<5) + return true; + return false; +} +// 获取当前窗口标题 +string getForegroundTitle(HWND hwnd){ + char title[1024]; + if (hwnd == NULL) return ""; + if(GetWindowTextA(hwnd, title, 1024) == 0){ + logFile<0;i--){ + if(rand()&1) isContinue = MessageBoxA(hwnd, "先思考一下,你现在真的有用电脑的必要吗?\n你现在应该做什么?\n想好了按确认", "请思考请思考", MB_YESNO) == IDYES; + else isContinue = MessageBoxA(hwnd, "先思考一下,你现在真的有用电脑的必要吗?\n你现在应该做什么?\n想好了按取消", "请思考请思考", MB_YESNO) == IDNO; + if(!isContinue){ + MessageBoxA(hwnd, "看来你并没有真正下定决心呢……", "叹气……", MB_OK); + return false; + } + } + return true; +} +map warningSet; +// 启动超出时间限制禁言程序 +void operateTimeExceeded(HWND hwnd){ + logFile<tm_hour==4&<m->tm_min==0){ + if(judgeEarlyMorning()) blackListTimeCount = 0; - } - // 获取顶层窗口名称 - HWND hwnd = GetForegroundWindow(); - if (hwnd == NULL) { - continue; - } - if(GetWindowTextA(hwnd, title, 1024) == 0){ - cout<<"GetWindowTextW failed"<=MAX_BLACKLIST_TIME_COUNT){ - muteAll(); - bool isContinue = true; - isContinue = MessageBoxA(hwnd, "半小时到了!你确定你需要继续看这个?", "半个小时提醒", MB_YESNO) == IDYES; - if(isContinue){ - MessageBoxA(hwnd, "如果你真的确定的话,按照我的指令连续点十次:", "唉,拿你没办法呢", MB_OK); - for(int i=0;i<10;i++){ - int randNum = rand()&1; - if(randNum){ - isContinue = MessageBoxA(hwnd, "先思考一下,你现在真的有用电脑的必要吗?\n你现在应该做什么?\n想好了按确认", "请思考请思考", MB_YESNO) == IDYES; - }else{ - isContinue = MessageBoxA(hwnd, "先思考一下,你现在真的有用电脑的必要吗?\n你现在应该做什么?\n想好了按取消", "请思考请思考", MB_YESNO) == IDNO; - } - if(!isContinue){ - MessageBoxA(hwnd, "看来你并没有真正下定决心呢……", "叹气……", MB_OK); - break; - } - } - } - unmuteAll(); - if(isContinue){ - MessageBoxA(hwnd, "好吧,看来你确实有急事,去忙吧,你再用二十分钟后我还会回来的!", "你先忙吧", MB_OK); - blackListTimeCount = MAX_BLACKLIST_TIME_COUNT - TOLENT_MORE_TIME; - }else{ - MessageBoxA(hwnd, "根据千嶂夹城制定的反摸鱼条例,你今天不准再摸鱼了!\n你有五秒钟保存重要文件,我数到五就强制关掉!","True Ending",MB_OK); - Sleep(5*1000); - // 强制关闭hwnd窗口 - PostMessageA(hwnd, WM_CLOSE, 0, 0); - } - }else if(blackListTimeCount%600==0){ - muteAll(); - MessageBoxA(hwnd, "你摸鱼已经十分钟了,冰澄命令你停下!", "十分钟提醒", MB_OK); - unmuteAll(); - }else if(blackListTimeCount%300==0){ - muteAll(); - MessageBoxA(hwnd, "你在摸鱼吗,又摸了五分钟了,冰澄提醒你正确休息", "五分钟提醒", MB_OK); - unmuteAll(); - } + if(blackListTimeCount>=MAX_BLACKLIST_TIME_COUNT) + operateTimeExceeded(hwnd); + else if (blackListTimeCount%600==0) + operateTimeWarning(hwnd,"你摸鱼已经十分钟了,冰澄命令你停下!"); + else if (blackListTimeCount%300==0) + operateTimeWarning(hwnd,"你在摸鱼吗,又摸了五分钟了,冰澄提醒你正确休息"); } - // 延时 - Sleep(1000); - static int clockCount = 0; - clockCount++; - if(clockCount%60==0){ + Sleep(1000); // 休眠1秒钟 + static int clockCount = 0; // 存档计时器 + if((++clockCount)%60==0) // 每分钟存档一次 saveData(); - } - // cout<