//参考链接//C\C++控制台程序隐藏方法总结https://blog.csdn.net/lynch0571/article/details/33320551
//取消提醒《 Win10你要允许此应用对你的电脑进行更改吗 》http://www.w10zj.com/Win10xy/Win10yh_1623.html/*这是一个后台运行的、每隔60s检查一次的、带有日志功能的断网重新连接程序。
早上0到6点,不执行断网重连和写日志功能,只有连续6次ping测试都失败了才会启动联网程序
要想使用它必须要配置好c语言环境,比如安装有mingw的codeblocks,vs不能后台运行,只能在codeblocks中实现后台
实现的方式就是每隔一段时间就去ping一下百度,如果ping失败了就启动上网程序,上网程序会自动连接网络。
使用时将该软件加入开机自启软件即可*/
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) //加上后可以后台运行#include#include#include#include#include#include#include#ifdef WIN32
#include
#else#include //linux下头文件
#endif#include
#define FILE_MAX_SIZE (1024*1024)//日志文件最大为1M
using namespacestd;/*获得当前时间字符串
@param buffer [out]: 时间字符串
@return 空*/
void get_local_time(char*buffer)
{
time_t rawtime;struct tm*timeinfo;
time(&rawtime);
timeinfo= localtime(&rawtime);
sprintf(buffer,"%04d-%02d-%02d %02d:%02d:%02d",
(timeinfo->tm_year + 1900), timeinfo->tm_mon + 1, timeinfo->tm_mday,
timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}/*获得日志文件大小
@param filename [in]: 文件名
@return 文件大小*/
long get_file_size(char*filename)
{long length = 0;
FILE*fp =NULL;
fp= fopen(filename, "rb");if (fp !=NULL)
{
fseek(fp,0, SEEK_END);
length=ftell(fp);
}if (fp !=NULL)
{
fclose(fp);
fp=NULL;
}returnlength;
}/*写入日志文件
@param filename [in]: 日志文件名
@param max_size [in]: 日志文件大小限制
@param buffer [in]: 日志内容
@param buf_size [in]: 日志内容大小
@return 空*/
void write_log_file(char* filename, long max_size, char*buffer, unsigned buf_size)
{if (filename != NULL && buffer !=NULL)
{//文件超过最大限制, 删除
long length =get_file_size(filename);if (length >max_size)
{
unlink(filename);//删除文件
}//写日志
{
FILE*fp;
fp= fopen(filename, "at+");if (fp !=NULL)
{char now[32];
memset(now,0, sizeof(now));
get_local_time(now);
fwrite(now, strlen(now)+ 1, 1, fp);
fwrite(buffer, buf_size,1, fp);
fclose(fp);
fp=NULL;
}
}
}
}/*后台运行的、每隔60s检查一次的、带有日志功能的断网重新连接程序*/
voidp()
{//隐藏窗口
HWND hwnd;
hwnd= FindWindow("ConsoleWindowClass", NULL); //处理顶级窗口的类名和窗口名称匹配指定的字符串,不搜索子窗口。
if(hwnd)
{
ShowWindow(hwnd, SW_HIDE);//设置指定窗口的显示状态
}while (1)
{//睡眠60s
_sleep(60000);//早上0到6点,不执行断网重连和写日志功能//now为1970 到目前经过秒数,ltm->tm_hour为现在的小时数
time_t now = time(0);
tm*ltm = localtime(&now);if (ltm->tm_hour > 6)
{int count = 0;//ping失败的次数
for (int i = 0; i < 6; i++)
{//写入日志文件
char buffer[32];
memset(buffer,0, sizeof(buffer));//断网重连
clock_t start, end;//计时
start =clock();
system("ping 8.8.8.8 -w 3500");//system执行cmd命令, 可以用cout打印返回结果
end =clock();double duration = ((double)end - start) /CLOCKS_PER_SEC;if (duration > 10.0)
{
count+= 1;
sprintf(buffer,"====> %s%d%s\n", "第", i, "次ping失败#############");
}else{
sprintf(buffer,"====> %s%d%s\n", "第", i, "次ping成功");
}char s[] = "log.txt";
write_log_file(s, FILE_MAX_SIZE, buffer, strlen(buffer));
}if(count == 6)
system("start /b C:\\\"Program Files\"\\\"Ruijie Networks\"\\\"Ruijie Supplicant\"\\RuijieSupplicant.exe");//路径用\\,双引号为转义字符,前面要加\//写入日志文件
char buffer[32];
memset(buffer,0, sizeof(buffer));if (count < 6)
sprintf(buffer,"====> %s%d%s\n", "6次ping测试成功了", 6 - count, "次,有网");elsesprintf(buffer,"====> %s\n", "6次ping测试全部都没有ping通过,没有网#######################################################################################################");char s[] = "log.txt";
write_log_file(s, FILE_MAX_SIZE, buffer, strlen(buffer));
}
}
}/*计时函数,没有用到*/
voidg()
{
clock_t start, end;
start=clock();
_sleep(1234);
end=clock();double duration = ((double)end - start) /CLOCKS_PER_SEC;
printf("%f second", duration);
}/*获取小时函数,这里只是测试,没用到*/
voidtime()
{//now为1970 到目前经过秒数,ltm->tm_hour为现在的小时数
time_t now = time(0);
tm*ltm = localtime(&now);
cout<< ltm->tm_hour << "蒋凯楠";
}intmain()
{
p();return 0;
}