自动阅读二代
这次我好好把这个程序完善了一下,优化如下:
1.每页阅读时间变准确了
2.提供两种阅读模式:顺序阅读和反复翻书
3.界面优化,更加好看
4.错误输入处理

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <conio.h>
int nScreenWidth, nScreenHeight;
void click(int x, int y)
{
//屏幕在水平和垂直方向上均匀分割成65535×65535个单元
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*65535/nScreenWidth, y*65535/nScreenHeight, 0, 0);
Sleep(50);//稍微延时50ms
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//鼠标左键按下
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//鼠标左键抬起
}
void move(int x,int y)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*65535/nScreenWidth, y*65535/nScreenHeight, 0, 0);
}
void main()
{
//HANDLE handle_color = GetStdHandle(STD_OUTPUT_HANDLE);
POINT ptB = { 0, 0 };
int choice1,choice2;
char choice3,back;
int x=-1,y=-1,nochange_right_x,nochange_right_y,nochange_left_x,nochange_left_y;
float time;
int scan,scan2;
LPPOINT xy = &ptB; //位置变量
backmenu:
system("title 自动阅读 by andywang") ;
printf("自动阅读 V2.0\n");
choose_again:
printf("1.顺序阅读模式\n");
printf("2.反复翻书模式\n");//72, 442 1920*1080下
printf("3.更多信息\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scanf("%d",&choice1);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
switch((int)choice1)
{
case 1: //1.顺序阅读
c1_chooseagain:
printf("请先进入阅读界面并调整窗口位置和大小,窗口不能遮挡按钮。\n");
printf("请选择一种输入坐标的方式:\n");
printf("1.自动获取\n");
printf("2.手动输入\n");
printf("9.返回主菜单\n");
nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
printf("当前屏幕分辨率为:%d %d(可能因为设置了缩放与实际情况不符)\n", nScreenWidth, nScreenHeight);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scanf("%d",&choice2);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(choice2==1)//自动
{
printf("把鼠标移动到按钮上并按q获取位置,按e确认并结束。\n");
while(1)
{
choice3=getch();
if(choice3=='e')
break;
else if(choice3=='q')
{
GetCursorPos(xy);
x=xy->x;y=xy->y;
printf("x=%d,y=%d\n",x ,y);
}
}
nochange_right_x=x;nochange_right_y=y;
printf("请输入单页阅读时间,单位秒(建议在60-120之间,至少为3)。\n");
while(1)
{
scan=scanf("%f",&time);
fflush(stdin);
if(scan==0|time<3)
{
printf("请重新输入:\n");
continue;
}
break;
}
time=time * 1000 ;
printf("开始阅读。\n");
while(1)
{
x=nochange_right_x;y=nochange_right_y;
printf("点击%d,%d\n",x,y);
click(x,y);
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
for(x=nochange_right_x;x>=100;x--)
{
move(x,y);
printf("移动到%d,%d\n",x,y);
Sleep(1);
}
printf("移动结束,移动了%d毫秒\n",nochange_right_x-100);
x=nochange_right_x;y=nochange_right_y;
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
system("cls");
}
}
else if(choice2==2) //手动
{
printf("请输入右侧按钮逻辑坐标,用空格隔开。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scan=scanf("%d",&x);
scan2=scanf("%d",&y);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(scan==0|scan2==0|x<0)
{
printf("请重新输入:\n");
continue;
}
break;
}
nochange_right_x=x;nochange_right_y=y;
printf("请输入单页阅读时间,单位秒(建议在60-120之间,至少为3)。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scan=scanf("%f",&time);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(scan==0|time<3)
{
printf("请重新输入:\n");
continue;
}
break;
}
time=time * 1000 ;
printf("开始阅读。\n");
while(1)
{
x=nochange_right_x;y=nochange_right_y;
printf("点击%d,%d\n",x,y);
click(x,y);
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
for(x=nochange_right_x;x>=100;x--)
{
move(x,y);
printf("移动到%d,%d\n",x,y);
Sleep(1);
}
printf("移动结束,移动了%d毫秒\n",nochange_right_x-100);
x=nochange_right_x;y=nochange_right_y;
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
system("cls");
}
}
else if(choice2==9)
{
system("cls");
goto backmenu;
}
else
{
system("cls");
printf("未知选项,请重新输入:\n");
goto c1_chooseagain;
}
case 2: //2.反复阅读
c2_chooseagain:
printf("请先进入阅读界面并调整窗口位置和大小,窗口不能遮挡按钮。\n");
printf("请选择一种输入坐标的方式:\n");
printf("1.自动获取\n");
printf("2.手动输入\n");
printf("9.返回主菜单\n");
nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
printf("当前屏幕分辨率为:%d %d(可能因为设置了缩放与实际情况不符)\n", nScreenWidth, nScreenHeight);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scanf("%d",&choice2);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(choice2==1)
{
chooseagain1:
printf("把鼠标移动到【右侧】按钮上并按q获取位置,按e确认并结束。\n");
while(1)
{
choice3=getch();
if(choice3=='e')
break;
else if(choice3=='q')
{
GetCursorPos(xy);
x=xy->x;y=xy->y;
printf("x=%d,y=%d\n",x ,y);
}
}
nochange_right_x=x;nochange_right_y=y;
printf("把鼠标移动到【左侧】按钮上并按q获取位置,按e确认并结束。\n");
while(1)
{
choice3=getch();
if(choice3=='e')
break;
else if(choice3=='q')
{
GetCursorPos(xy);
x=xy->x;y=xy->y;
printf("x=%d,y=%d\n",x ,y);
}
}
nochange_left_x=x;nochange_left_y=y;
if(nochange_left_x>nochange_right_x)
{
printf("左右不分?你输入的左侧按钮坐标大于右侧按钮坐标\n");
goto chooseagain1;
}
printf("请输入单页阅读时间,单位秒(建议在60-120之间,至少为3)。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scan=scanf("%f",&time);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(scan==0|time<3)
{
printf("请重新输入:\n");
continue;
}
break;
}
time=time * 1000 ;
printf("开始阅读。\n");
while(1)
{
x=nochange_right_x;y=nochange_right_y;
printf("点击右侧按钮%d,%d\n",x,y);
click(x,y);
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
for(x=nochange_right_x;x>=100;x--)
{
move(x,y);
printf("移动到%d,%d\n",x,y);
Sleep(1);
}
printf("移动结束,移动了%d毫秒\n",nochange_right_x-100);
x=nochange_right_x;y=nochange_right_y;
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
//system("cls");
x=nochange_left_x;y=nochange_left_y;
printf("点击左侧按钮%d,%d\n",x,y);
click(x,y);
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
for(x=x;x<=nScreenWidth-100;x++)
{
move(x,y);
printf("移动到%d,%d\n",x,y);
Sleep(1);
}
printf("移动结束,移动了%d毫秒\n",nochange_right_x-100);
x=nochange_right_x;y=nochange_right_y;
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
system("cls");
}
}
if(choice2==2)
{
chooseagain2:
printf("请输入右侧按钮逻辑坐标,用空格隔开。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scan=scanf("%d",&x);
scan2=scanf("%d",&y);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(scan==0|scan2==0|x<0)
{
printf("请重新输入:\n");
continue;
}
break;
}
nochange_right_x=x;nochange_right_y=y;
printf("请输入左侧按钮逻辑坐标,用空格隔开。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scan=scanf("%d",&x);
scan2=scanf("%d",&y);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(scan==0|scan2==0|x<0)
{
printf("请重新输入:\n");
continue;
}
break;
}
nochange_left_x=x;nochange_left_y=y;
if(nochange_left_x>nochange_right_x)
{
printf("左右不分?你输入的左侧按钮坐标大于右侧按钮坐标\n");
goto chooseagain2;
}
printf("请输入单页阅读时间,单位秒(建议在60-120之间,至少为3)。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN);
printf(">>");
scan=scanf("%f",&time);
fflush(stdin);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if(scan==0|time<3)
{
printf("请重新输入:\n");
continue;
}
break;
}
time=time * 1000 ;
printf("开始阅读。\n");
while(1)
{
x=nochange_right_x;y=nochange_right_y;
printf("点击右侧按钮%d,%d\n",x,y);
click(x,y);
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
for(x=nochange_right_x;x>=100;x--)
{
move(x,y);
printf("移动到%d,%d\n",x,y);
Sleep(1);
}
printf("移动结束,移动了%d毫秒\n",nochange_right_x-100);
x=nochange_right_x;y=nochange_right_y;
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
//system("cls");
x=nochange_left_x;y=nochange_left_y;
printf("点击左侧按钮%d,%d\n",x,y);
click(x,y);
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
for(x=x;x<=nScreenWidth-100;x++)
{
move(x,y);
printf("移动到%d,%d\n",x,y);
Sleep(1);
}
printf("移动结束,移动了%d毫秒\n",nochange_right_x-100);
x=nochange_right_x;y=nochange_right_y;
printf("开始休息%f毫秒\n",time/2-(nochange_right_x-100)/2);
Sleep(time/2-(nochange_right_x-50));
system("cls");
}
}
else if(choice2==9)
{
system("cls");
goto backmenu;
}
else
{
system("cls");
printf("未知选项,请重新输入:\n");
goto c2_chooseagain;
}
case 3:
printf("\n作者的话:\n如果可以的话还是请你认真读英语小说,本软件仅供学习研究。\n");
printf("关于规避掉线检测:由于网站设定,长时间不改变鼠标位置会被判定为掉线。\n");
printf("所以当每一页的阅读时间快到一半时,程序会让鼠标移动一段距离。\n");
printf("停止的地方不一定是下次点击的位置,且鼠标移动不会影响单页阅读时间。\n");
printf("按b返回主菜单。\n");
while(1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
back=getch();
fflush(stdin);
if(back=='b')
{
system("cls");
goto backmenu;
}
}
case 4:
default:
printf("未知命令,请重新输入\n");
goto choose_again;
}
}
终于完工了,累死我啦😂