文章目录
- 运行效果
- 功能描述
- 代码
- mian.cpp
- include
- MouseKeyControl.h
- TipsManagement.h
- src
- MouseControl.cpp
- TipsManagement.cpp
运行效果
功能描述
线程一:每隔n+随机秒,动一下鼠标滚轮,防止屏幕息屏。
线程二:运行时加载txt文件中的句子到数组,然后每隔n秒随机显示一个句子。
代码
mian.cpp
#include<iostream>
#include"TipsManagement.h"
#include"MouseKeyControl.h"
#include <thread>
using namespace std;
// 声明两个线程函数,以便可以独立于 main 函数运行
void showTipsInThread(TipsManagement* tm) {
while (true) {
tm->randomShowTip();
}
}
void autoRollMouseInThread(MouseKeyControl* mc)
{
while (true) {
mc->autoScrollMouseWheel();
}
}
int main()
{
TipsManagement* tm = new TipsManagement();
MouseKeyControl* mc = new MouseKeyControl();
tm->n = 2 * 60 * 1000;
mc->n = 3 * 60 * 1000;;
thread tipsThread(showTipsInThread, tm);
thread mouseThread(autoRollMouseInThread, mc);
// 等待线程完成
tipsThread.join();
mouseThread.join();
// delete tm;
// delete mc;
return 0;
}
include
MouseKeyControl.h
#pragma once
#include<iostream>
#include<string>
#include <windows.h>
#include<fstream>
#include <algorithm>
#include <random>
#include <ctime>
using namespace std;
class MouseKeyControl
{
public:
unsigned int n;
RECT screenRect; // get screen size;
INPUT inputs[2] = {};
int delta;
int offsets[10] = {-3240,-3010,-2030,-1003,0,0,-998,-817,-603,-710};
void initRandomIndexVec();
void autoRandomMoveMouse();
void autoScrollMouseWheel();
MouseKeyControl();
~MouseKeyControl();
};
TipsManagement.h
#pragma once
#include<iostream>
#include<string>
#include <windows.h>
#include<fstream>
#include <algorithm>
#include <random>
#include <ctime>
#define FILENAME "tipsFile.txt"
using namespace std;
class TipsManagement
{
public:
bool fileIsEmpty;
int tipsNum;
string* tipsArr;
vector<int> randomIndexVec;
unsigned int n; // sleep n minutes;
void showMenu();
void initTips();
void initRandomIndexVec();
void randomShowTip();
int getTipsNum();
void showAllTips();
void cleanFile();
void save();
void addTips();
void findTips();
void deleteTips();
void modifyTips();
void sortTips();
void exitSystem();
string GbkToUtf8(string src_str1);
string Utf8ToGbk(string src_str1);
TipsManagement();
~TipsManagement();
};
src
MouseControl.cpp
#include "MouseKeyControl.h"
#include <windows.h>
MouseKeyControl::MouseKeyControl()
{
SystemParametersInfo(SPI_GETWORKAREA, 0, &this->screenRect, 0);
// 创建一个包含两个INPUT结构体的数组,一个用于按下滚轮,一个用于释放滚轮
this->delta = 1;
ZeroMemory(this->inputs, sizeof(this->inputs));
// 第一个INPUT结构体:滚轮滚动(向下滚动为正,向上滚动为负)
this->inputs[0].type = INPUT_MOUSE;
this->inputs[0].mi.dx = 0;
this->inputs[0].mi.dy = 0;
this->inputs[0].mi.mouseData = delta * WHEEL_DELTA; // WHEEL_DELTA是滚动一个“滴答”的量
this->inputs[0].mi.dwFlags = MOUSEEVENTF_WHEEL; // 指定这是一个滚轮事件
this->inputs[0].mi.time = 0;
}
void MouseKeyControl::autoRandomMoveMouse()
{
// 初始化随机数种子
// srand(static_cast<unsigned int>(time(0)));
Sleep(this->n);
// 生成随机位置
int x = rand() % (this->screenRect.right - this->screenRect.left);
int y = rand() % (this->screenRect.bottom - this->screenRect.top);
// 将鼠标移动到随机位置
SetCursorPos(x + this->screenRect.left, y + this->screenRect.top);
}
void MouseKeyControl::autoScrollMouseWheel() {
// 根据当前时间初始化
srand(static_cast<unsigned int>(time(0)));
// 生成0到10的随机整数(包含0但不包含10)
int randomNum = rand() % 10;
Sleep(this->n+this->offsets[randomNum]);
// 正数表示向上滚动
SendInput(1, this->inputs, sizeof(INPUT));
}
MouseKeyControl::~MouseKeyControl()
{
}
TipsManagement.cpp
#include "TipsManagement.h"
TipsManagement::TipsManagement()
{
this->n = 3000; // the default sleep time is 3s.
ifstream ifs;
ifs.open(FILENAME, ios::in);
//-----------------------1.file is not exist-------------------------
if (!ifs.is_open())
{
cout << "The file does not exist!" << endl;
// the label of the empty file
this->fileIsEmpty = true;
// label the tip number to 0
this->tipsNum = 0;
// set the tip Array is Null.
this->tipsArr = NULL;
ifs.close();
return;
}
//----------------2.file is exist, but the data is NULL.-------------------
char ch;
ifs >> ch; // read a char in the file.
if (ifs.eof()) // eof is the end lable of the file.
{
cout << "The file is empty!" << endl;
this->tipsNum = 0;
this->fileIsEmpty = true;
this->tipsArr = NULL;
ifs.close();
return;
}
//---------------------3.file is exist and the data are not null.-------------------------
int num = this->getTipsNum();
// cout << "the file have " << num << " tips." << endl;
this->tipsNum = num;
this->fileIsEmpty = false;
this->tipsArr = new string[this->tipsNum];
this->initTips(); // read the file tips to tipsArr
// this->showAllTips();
this->initRandomIndexVec();// create the random vec index
}
void TipsManagement::initRandomIndexVec()
{
for (int i = 0; i < this->tipsNum; i++)
{
this->randomIndexVec.push_back(i);
}
random_device rd;
mt19937 g(rd());
shuffle(begin(this->randomIndexVec), end(this->randomIndexVec), g);
}
void TipsManagement::randomShowTip()
{
int index;
for (int i = 0; i < this->tipsNum; i++)
{
index = this->randomIndexVec[i];
cout<<endl;
cout<< this->tipsArr[index]<<endl;
Sleep(this->n);
system("cls");
}
}
// when open the tips file, read all tips to tipsArr.
void TipsManagement::initTips()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
string tip;
int index = 0;
while (ifs >> tip)
{
this->tipsArr[index] = tip;
index++;
}
ifs.close();
}
// read tips file to get the number of tips.
int TipsManagement::getTipsNum()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
string tip;
int num = 0;
while (ifs >> tip)
{
num++;
}
ifs.close();
return num;
}
void TipsManagement::showAllTips()
{
if (this->fileIsEmpty)
{
cout << "File is not exist or the file is empty!" << endl;
}
else
{
for (int i = 0; i < this->tipsNum; i++)
{
cout<<this->tipsArr[i]<<endl;
}
}
system("pause");
system("cls");
}
//------------------------------------------------useless---------------------------------------------------
void TipsManagement::showMenu()
{
cout << "**********************************************" << endl;
cout << "************0.Exit tipsManagement.*************" << endl;
cout << "************1.Add tip.*******************" << endl;
cout << "************2.Show tips.******************" << endl;
cout << "************3.Delete someone tip.******" << endl;
cout << "************4.Modify tip.****" << endl;
cout << "************5.Find tip.******" << endl;
cout << "************6.Sort by id.*****************" << endl;
cout << "************7.Clear all documents*************" << endl;
cout << "**********************************************" << endl;
cout << endl;
}
void TipsManagement::addTips()
{
cout << "Please enter the number of tips to be added:"<<endl;
int addNum = 0;
cin >> addNum;
if (addNum > 0)
{
int newSize = this->tipsNum + addNum;
string* newSpace = new string[newSize];
if (this->tipsArr != NULL)
{
for (int i = 0; i < this->tipsNum; i++)
{
newSpace[i] = this->tipsArr[i];
}
}
for (int i = 0; i < addNum; i++)
{
string tip;
cout << "Please enter the " << i + 1 << " tip:" << endl;
cin >> tip;
cout<<"new input:"<<tip<<endl;
newSpace[this->tipsNum + i] = tip;
cout<<"new input(arr):"<<newSpace[this->tipsNum + i]<<endl;
}
delete[] this->tipsArr;
this->tipsArr = newSpace;
this->tipsNum = newSize;
this->fileIsEmpty = false;
cout << "Successfully added " << addNum << " new tips!" << endl;
this->save();
}
else
{
cout << "Your input is incorrect." << endl;
}
system("pause");
system("cls");
}
// put the tipsArr to file.
void TipsManagement::save()
{
ofstream ofs;
ofs.open(FILENAME, ios::out);
for (int i = 0; i < this->tipsNum; i++)
{
ofs << this->tipsArr[i]<< endl;
}
ofs.close();
}
void TipsManagement::exitSystem()
{
cout << "exit." << endl;
system("pause");
exit(0);
}
string TipsManagement::GbkToUtf8(string src_str1)
{
const char *src_str = src_str1.data();
int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
std::string strTemp = str;
if (wstr) delete[] wstr;
if (str) delete[] str;
return strTemp;
}
string TipsManagement::Utf8ToGbk(string src_str1) //const char *src_str
{
const char* src_str = src_str1.data();
int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);
wchar_t* wszGBK = new wchar_t[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char* szGBK = new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
std::string strTemp(szGBK);
if (wszGBK) delete[] wszGBK;
if (szGBK) delete[] szGBK;
return strTemp;
}
TipsManagement::~TipsManagement()
{
}