C++读取txt文件中的句子在终端显示,同时操控鼠标滚轮(涉及:多线程,产生随机数,文件操作等)
文章目录
- 运行效果
- 功能描述
- 代码
- 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 0this->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()
{}
相关文章:

C++读取txt文件中的句子在终端显示,同时操控鼠标滚轮(涉及:多线程,产生随机数,文件操作等)
文章目录 运行效果功能描述代码mian.cppincludeMouseKeyControl.hTipsManagement.h srcMouseControl.cppTipsManagement.cpp 运行效果 功能描述 线程一:每隔n随机秒,动一下鼠标滚轮,防止屏幕息屏。 线程二:运行时加载txt文件中的…...

Android 中使用高德地图实现根据经纬度信息画出轨迹、设置缩放倍数并定位到轨迹路线的方法
一、添加依赖和权限 在项目的build.gradle文件中添加高德地图的依赖: implementation com.amap.api:maps:latest_version在AndroidManifest.xml文件中添加必要的权限: <uses-permission android:name"android.permission.ACCESS_FINE_LOCATIO…...

LeetCode从入门到超凡(二)递归与分治算法
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档;在算法设计中,递归和分治算法是两种非常重要的思想和方法。它们不仅在解决复杂问题时表…...

superset 解决在 mac 电脑上发送 slack 通知的问题
参考文档: https://superset.apache.org/docs/configuration/alerts-reports/ 核心配置: FROM apache/superset:3.1.0USER rootRUN apt-get update && \apt-get install --no-install-recommends -y firefox-esrENV GECKODRIVER_VERSION0.29.0 RUN wget -q https://g…...

SQL_UNION
在 SQL 中使用 UNION 操作符时,被联合的两个或多个 SELECT 语句的列数必须相同,并且相应的列数据类型也需要兼容。这是因为 UNION 操作符会将结果组合成单个结果集,每个 SELECT 语句的结果行将按顺序放置在结果集中。 例如,如果你…...
高等代数笔记(2)————(弱/强)数学归纳法
数学归纳法的引入情景其实很简单,就是多米诺骨牌。 推倒所有多米诺骨牌的关键就是推倒第一块,以及确保第一块倒下后会带动第二块,第二块带动第三块,以此类推,也就是可以递推。由此我们可以归纳出所有的多米诺骨牌都可…...

模拟自然的本质:与IBM量子计算研究的问答
量子计算可能是计算领域的下一个重大突破,但它的一般概念仍然处于炒作和猜测的现状?它能破解所有已知的加密算法吗?它能设计出治愈所有疾病的新分子吗?它能很好地模拟过去和未来,以至于尼克奥弗曼能和他死去的儿子说话…...

Robot Operating System——带有时间戳和坐标系信息的多边形信息
大纲 应用场景1. 机器人导航场景描述具体应用 2. 环境建模场景描述具体应用 3. 路径规划场景描述具体应用 4. 无人机飞行控制场景描述具体应用 5. 机械臂运动控制场景描述具体应用 6. 自动驾驶车辆控制场景描述具体应用 定义字段解释 案例 geometry_msgs::msg::PolygonStamped …...

内网穿透(当使用支付宝沙箱的时候需要内网穿透进行回调)
内网穿透 一、为什么要使用内网穿透: 内网穿透也称内网映射,简单来说就是让外网可以访问你的内网:把自己的内网(主机)当做服务器,让外网访问 二、安装路由侠 路由侠-局域网变公网 (luyouxia.com) 安装成功如下: 三…...

Contact Form 7最新5.9.8版错误修复方案
最近有多位用户反应Contact Form 7最新5.9.8版的管理页面有错误如下图所示 具体错误文件的路径为wp-content\plugins\contact-form-7\admin\includes\welcome-panel.php on line 153 找到welcome-panel.php这个文件编辑它,将如下图选中的部分删除 删除以后…...

【第十一章:Sentosa_DSML社区版-机器学习之分类】
目录 11.1 逻辑回归分类 11.2 决策树分类 11.3 梯度提升决策树分类 11.4 XGBoost分类 11.5 随机森林分类 11.6 朴素贝叶斯分类 11.7 支持向量机分类 11.8 多层感知机分类 11.9 LightGBM分类 11.10 因子分解机分类 11.11 AdaBoost分类 11.12 KNN分类 【第十一章&…...

kafka3.8的基本操作
Kafka基础理论与常用命令详解(超详细)_kafka常用命令和解释-CSDN博客 [rootk1 bin]# netstat -tunlp|grep 90 tcp6 0 0 :::9092 :::* LISTEN 14512/java [rootk1 bin]# ./kafka-topics.s…...

如何检测并阻止机器人活动
恶意机器人流量逐年增加,占 2023 年所有互联网流量的近三分之一。恶意机器人会访问敏感数据、实施欺诈、窃取专有信息并降低网站性能。新技术使欺诈者能够更快地发动攻击并造成更大的破坏。机器人的无差别和大规模攻击对所有行业各种规模的企业都构成风险。 但您的…...

《linux系统》基础操作
二、综合应用题(共50分) 随着云计算技术、容器化技术和移动技术的不断发展,Unux服务器已经成为全球市场的主导者,因此具备常用服务器的配置与管理能力很有必要。公司因工作需要,需要建立相应部门的目录,搭建samba服务器和FTP服务器,要求将销售部的资料存放在samba服务器…...

EMT-LTR--学习任务间关系的多目标多任务优化
EMT-LTR–学习任务间关系的多目标多任务优化 title: Learning Task Relationships in Evolutionary Multitasking for Multiobjective Continuous Optimization author: Zefeng Chen, Yuren Zhou, Xiaoyu He, and Jun Zhang. journal: IEE…...

MySQL record 08 part
数据库连接池: Java DataBase Connectivity(Java语言连接数据库) 答: 使用连接池能解决此问题, 连接池,自动分配连接对象,并对闲置的连接进行回收。 常用的数据库连接池: 建立数…...

打造以太坊数据监控利器:InfluxDB与Grafana构建Geth可视化分析平台
前言 以太坊客户端收集大量数据,这些数据可以按时间顺序数据库的形式读取。为了简化监控,这些数据可以输入到数据可视化软件中。在此页面上,将配置 Geth 客户端以将数据推送到 InfluxDB 数据库,并使用 Grafana 来可视化数据。 一…...

对onlyoffice进行定制化开发
基于onlyoffice8.0源码,进行二次开发,可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加,去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…...

使用llama.cpp 在推理MiniCPM-1.2B模型
llama.cpp 是一个开源项目,它允许用户在C中实现与LLaMA(Large Language Model Meta AI)模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型,虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重,但它…...

分布式环境中,接口超时重试带来的的幂等问题如何解决?
目录标题 幂等不能解决接口超时吗?幂等的重要性什么是幂等?为什么需要幂等?接口超时了,到底如何处理? 如何设计幂等?幂等设计的基本流程实现幂等的8种方案1.selectinsert主键/唯一索引冲突(常用)2.直接insert 主键…...

设计一个推荐系统:使用协同过滤算法
设计一个推荐系统:使用协同过滤算法 在当今数据驱动的时代,推荐系统已经成为了许多在线平台(如电商、社交媒体和流媒体服务)不可或缺的一部分。推荐系统通过分析用户的行为和偏好,向用户推荐可能感兴趣的内容或产品。本文将详细介绍如何设计一个基于协同过滤算法的推荐系…...

Linux 基本指令(二)
目录 1. more指令 2. less指令(重要) 3. head指令 4. tail指令 5. date指令 (1)可以通过选项来指定格式: 编辑 (2)在设定时间方面 (3)时间戳 6. cal指令 7. find指令 8. grep指令 9. alias指令 10. zip指令与unzip指令 (1). zip指令 (2). unzip指令…...

Facebook的用户隐私保护:从争议到革新
Facebook早期的数据收集方式引发了隐私担忧。平台的快速增长和用户数据的大规模收集使得隐私问题逐渐显现。尤其是在2018年,剑桥分析事件暴露了数千万用户数据被不当使用的问题。这一事件揭示了Facebook在数据保护方面的严重漏洞,引发了公众对隐私保护的…...

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23
计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23 本期,我们对大语言模型在表情推荐, 软件安全和 自动化软件漏洞检测等方面如何应用,提供几篇最新的参考文章。 1 Semantics Preserving Emoji Recommendation with Large Language Mod…...

C++(学习)2024.9.20
目录 C面向对象的基础知识 this指针 概念 功能 1.类内调用成员 2.区分重名的成员变量和局部变量 3. 链式调用 static关键字 1.静态局部变量 2.静态成员变量 3.静态成员函数 4.单例设计模式 const关键字 1.const修饰成员函数 2.const修饰对象 3.const修饰成员变量…...

让AI激发创作力:OpenAI分享5位专业作家利用ChatGPT写作的案例技巧
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...

UEFI EDK2框架学习 (一)
01 Shell界面打印 执行qemu指令后 qemu-system-x86_64 -drive ifpflash,formatraw,fileOVMF.fd -nographic -net none出现shell界面 02 在UEFI shell中创建APP 创建SimplestApp文件夹以及SimplestApp.c、SimplestApp.inf cd edk2 mkdir SimplestAppuuidgen // generate …...

基于 BERT 的自定义中文命名实体识别实现
基于 BERT 的自定义中文命名实体识别实现 在自然语言处理中,命名实体识别(Named Entity Recognition,NER)是一项重要的任务,旨在识别文本中的特定实体,如人名、地名、组织机构名等。本文将介绍如何使用 BERT 模型实现自定义中文命名实体识别,并提供详细的代码分析和解读…...

中秋节特别游戏:给玉兔投喂月饼
🖼️ 效果展示 📜 游戏背景 在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙 🎮 游戏设计 人…...

python pdf转word或excel
python pdf转word或excel 直接上源码 main import gradio as gr import pdf2docx as p2d import Pdf2Excel as p2e import utils.id.IdUtil as idUtildef convert_pdf_to(pdf_file, pdf_pwd, pdf_to_type):if pdf_to_type "docx":# Convert PDF to DOCXcv p2d.C…...