📄 menu.bak
字号:
/* Generic menu generator */
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <process.h>
#include <dos.h>
#include "..\wba\gw\custype.h"
//#define ENCRYPT
#define ERROR_SUCCESS 0
//void HideCursor(int flag);
int readini(BYTE * section,BYTE * entry,BYTE * value,BYTE * filename,INT nCount);
void IniError(int r);
void Status(BYTE * info);
void DisplayTime();
/*
void HideCursor(int flag)
{
if(flag)
{
asm{
mov ah,01h
mov ch,00011011b
mov cl,00001100b
int 10h
}
}
else
{
asm{
mov ah,01h
mov ch,00001011b
mov cl,00001100b
int 10h
}
}
}
*/
int readini(BYTE * section,BYTE * entry,BYTE * value,BYTE * filename,INT nCount)
{
FILE * fp;
if((fp=fopen(filename,"rt"))==NULL)
return -1; //file open error.
BYTE ch;
BYTE * se = new BYTE[128];
BYTE * en = new BYTE[2048];
BYTE * temp = new BYTE[2048];
while(!feof(fp))
{
ch = fgetc(fp);
if(ch=='[')
{
fgets(se,128-1,fp);
BYTE * c;
if ((c=strchr(se,']'))==NULL)
{
fclose(fp);
delete [] se; delete [] en; delete [] temp;
return 1; //'[' and ']' is not patch.
}
* c = '\0';
if (strcmp(se,section)==0) break;
}
}
if(!feof(fp))
{
Continue:
while(TRUE)
{
if(fgets(en,2048-1,fp) == NULL) break;
if(!strchr(en,'[')) break;
//!strchr(fgets(en,2048-1,fp),'[')&&!feof(fp);
if(strstr(en,entry)!=NULL)
{
for(int i=strlen(en);i>0;--i)
{
if(en[i-1]!='\r'&&en[i-1]!='\n'&&en[i-1]!=' ')
{
en[i]='\0';
break;
}
}
int canread = 0;
for(int n=0;n<strlen(en);n++)
{
if (en[n]=='=') canread = 1;
if (canread)
{
if (en[n+1]!=' ')
{
//strcpy(value,&en[n+1]);
INT nMinLen = nCount<strlen(en)-n?nCount:strlen(en)-n;
memcpy(value,&en[n+1],nMinLen);
* (value+nMinLen) = '\0';
fclose(fp);
delete [] se; delete [] en; delete [] temp;
return 0; //success
}
}
}
}
}
}
fclose(fp);
delete [] se; delete [] en; delete [] temp;
return 2; //not found entry point.
}
void IniError(int r)
{
switch(r)
{
case 1: Status("<menu.ini>'[' and ']' is not match."); getch();
exit(EXIT_FAILURE); break;
case 2: Status("<menu.ini>Not found entry point."); getch();
exit(EXIT_FAILURE); break;
case -1:Status("<menu.ini>Not found menu.ini."); getch();
exit(EXIT_FAILURE); break;
}
}
void Status(BYTE * info)
{
textattr((BLACK<<4)+WHITE);
gotoxy(1,25);
clreol();
cprintf(info);
}
void DisplayTime()
{
static struct time tcOld,tcNew;
gettime(&tcNew);
if(tcOld.ti_sec != tcNew.ti_sec)
{
int xOld = wherex(),yOld = wherey();
gotoxy(73,1);
printf("%02d:%02d:%02d",tcNew.ti_hour,tcNew.ti_min,tcNew.ti_sec);
gotoxy(xOld,yOld);
tcOld = tcNew;
}
}
int main(int argc,char * argv[])
{
int rv/*The return value of functions*/;
#ifdef ENCRYPT
/*-- Authentication --*/
rv = spawnl(P_WAIT,"checkdog.dll","","xiaorq","rqxiao","logon",NULL);
if(rv == -1)
{
printf("\nNot found DLL(\"checkdog.dll\")!");
return -1;
}
if(rv != 0x79)
{
printf("\nUnavailable DLL(\"checkdog.dll\")!");
return -1;
}
rv = spawnl(P_WAIT,"checkdog.dll","","xiaorq","rqxiao",NULL);
//if(rv == -1) printf("\nNot found DLL(\"checkdog.dll\")!");
if(rv != ERROR_SUCCESS) return -1;
#endif
clrscr();
//HideCursor(1);
//Determine the config file
char * pIniFile = "Menu.ini";
if(argc==2) pIniFile = argv[1];
BYTE * title = new BYTE[80+1];
assert(title);
IniError(readini("MenuInfo","Title",title,pIniFile,80));
BYTE pwd[8+1];
IniError(readini("MenuInfo","PWD",pwd,pIniFile,8));
int MenuItemCount; BYTE * temp = new BYTE[80+1]; assert(temp);
IniError(readini("MenuInfo","MenuItemCount",temp,pIniFile,32));
sscanf(temp,"%d",&MenuItemCount); assert(MenuItemCount < 80+1);
BYTE * Name = new BYTE [20*MenuItemCount+1];
BYTE line[3], Barline[7];
BYTE * pCmdArr = new BYTE[(80+1)*MenuItemCount+1]; assert(pCmdArr);
for(int i =0;i<MenuItemCount;i++)
{
strcpy(Barline,"Bar");
sprintf(line,"%1d",i+1); strcat(Barline,line);
IniError(readini(Barline,"Name",temp,pIniFile,19));
temp[20] = NULL;
strcpy((Name+20*i),temp);
IniError(readini(Barline,"RunCommand",pCmdArr+81*i,pIniFile,80));
}
int id=0;
Redraw:
clrscr();
system("cls");
textattr((BLUE<<4)+WHITE);
gotoxy(1,2);
cprintf("哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪");
gotoxy(1,24);
clreol();
cprintf("哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪");
gotoxy((80-strlen(title))/2,1);
cprintf(title);
int px,py; px=1; py=3;
textattr((BLACK<<4)+WHITE);
for(i=0;i<MenuItemCount;i++)
{
if(i>20)
{
px=20*(i/21)+1; py=i%21+3;
gotoxy(px,py);
}
else
{
gotoxy(px,py);
py++;
}
if(i==id)
{
textattr((GREEN<<4)+WHITE);
}
else textattr((BLACK<<4)+WHITE);
cprintf(Name+20*i);
}
Status(pCmdArr+81*id);
BYTE key; int Loopflag/*,ReturnValue*/; Loopflag = 1;
while(Loopflag)
{
while(TRUE)
{
if(kbhit()) break;
DisplayTime();
}
key = getch();
if(!key) key = getch();
if(key==0x2d) //Alt+X
{
system("cls");
if(strlen(pwd)!=0)
{
char * pPWD = getpass("Password:");
if(!strcmp(pPWD,pwd)) Loopflag = 0;
else goto Redraw;
}
else
Loopflag = 0;
}
if(key == '\x5') //Ctrl+E for editing config file
{
strcpy(temp,pCmdArr+(80+1)*id);
int nLen = strlen(temp); BYTE ini[4],inifile[40];
if(temp[nLen-1]==';') temp[nLen-1]='\0';
strcpy(ini,temp+nLen-3);
if(strcmp(strupr(ini),"INI")==0)
{
strcpy(inifile,"edit ");
strcat(inifile,strrchr(temp,' ')?strrchr(temp,' ')+1:"");
if(strrchr(temp,';'))
{
*strrchr(temp,';') = '\0';
BYTE cmd[40+1]; int n=0;
for(int i = 0;i<=strlen(temp);i++)
{
if(temp[i]!=';'&&temp[i]!='\0')
{
cmd[i-n]=temp[i];
}
else
{
cmd[i-n]='\0';
textcolor(WHITE);
if(strlen(cmd)!=0) system(cmd);
n = i+1;
}
}
}
system(inifile);
goto Redraw;
}
}
if(key==0x50||key==0x48||key==0x47||key==0x4f||key==0x4b||key==0x4d) //Down arrow,Up arrow,Home,End,Left arrow,Right arrow
{
textattr((BLACK<<4)+WHITE);
px=20*(id/21)+1; py=id%21+3;
gotoxy(px,py);
cprintf(Name+20*id);
textattr((GREEN<<4)+WHITE);
if(key==0x50)
{
id++;
if(id==MenuItemCount) id = 0;
}
else if(key==0x48)
{
id--;
if(id<0) id = MenuItemCount-1;
}
else if(key==0x47) id=0;
else if(key==0x4f) id=MenuItemCount-1;
else if(key==0x4b) id=id-21<0?id:id-21;
else if(key==0x4d) id=id+21>MenuItemCount-1?id:id+21;
px=20*(id/21)+1; py=id%21+3;
gotoxy(px,py);
cprintf(Name+20*id);
Status(pCmdArr+81*id);
}
if(key==0x0d)
{
BYTE cmd[40+1]; int n=0;
strcpy(temp,pCmdArr+(80+1)*id);
for(int i = 0;i<=strlen(temp);i++)
{
if(temp[i]!=';'&&temp[i]!='\0')
{
cmd[i-n]=temp[i];
}
else
{
cmd[i-n]='\0';
textcolor(WHITE);
if(strlen(cmd)!=0) system(cmd);
n = i+1;
}
}
goto Redraw;
}
}
delete [] title; delete []temp; delete [] Name; delete pCmdArr;
//HideCursor(0);
system("cls");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -