📄 wacmenu.cpp
字号:
// wacmenu.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include "wacmenu.h"
#include "resource.h"
BUTTON g_Button[BUTTON_COUNT];
WINDOW g_Window;
BOOL g_bExit = FALSE;
DWORD g_TimerId;
//char g_ExePath[MAX_PATH];
void InitButtonData()
{
HANDLE Handle = ConOutputHandle();
if(GetConsoleScreenBufferInfo(Handle, &g_Buffer)){
if(g_Buffer.dwSize.Y > 60)
g_Buffer.dwSize.Y = 60;
g_PosX = g_Buffer.dwSize.X/2-40;
g_PosY = g_Buffer.dwSize.Y/2-12;
g_StepX = g_Buffer.dwSize.X/4-12;
g_StepY = (g_Buffer.dwSize.Y - 1)/(BUTTON_COUNT/2+2);
g_PosY = ((g_Buffer.dwSize.Y - 1)-(BUTTON_COUNT/2+2)*g_StepY)/3-1;
}
ConClearScreen(0,0,g_Buffer.dwSize.X-1,g_Buffer.dwSize.Y-1,0);
ConDrawPanel(0,0,g_Buffer.dwSize.X-1,g_Buffer.dwSize.Y-1,BASIC_COLOR);
g_Button[0].m_ButtonName = new char[20];
memset(g_Button[0].m_ButtonName, 0, 20*sizeof(char));
for(int i=1; i < BUTTON_COUNT; i++){
g_Button[i].m_ButtonName = new char[15];
memset(g_Button[i].m_ButtonName, 0, 15*sizeof(char));
g_Button[i].m_Remark = new char[80];
memset(g_Button[i].m_Remark, 0, 80*sizeof(char));
}
g_Button[0].m_ButtonName = "WAC Explorer";
g_Button[1].m_ButtonName = "Registry Editor";
g_Button[2].m_ButtonName = "Text Editor";
g_Button[3].m_ButtonName = "Mail Inbox";
g_Button[4].m_ButtonName = "Chat Tool";
g_Button[5].m_ButtonName = "Configurations";
g_Button[6].m_ButtonName = "Service Manager";
g_Button[7].m_ButtonName = "Event Viewer";
g_Button[8].m_ButtonName = "Binary Editor";
g_Button[9].m_ButtonName = "Process Viewer";
g_Button[10].m_ButtonName = "Session Manager";
g_Button[11].m_ButtonName = "User Manager";
g_Button[12].m_ButtonName = "System Information";
g_Button[13].m_ButtonName = "Quit";
g_Button[0].m_Remark = "Exploring server's local files or network neighborhoods ";
g_Button[1].m_Remark = "View and edit Windows registry ";
g_Button[2].m_Remark = "A much powerful text editor than the old DOS edit tool ";
g_Button[3].m_Remark = "A tool that let you view your email inbox messages ";
g_Button[4].m_Remark = "A chat tool between WAC users ";
g_Button[5].m_Remark = "Configurations WAC Server for this user ";
g_Button[6].m_Remark = "Managing all Windows services ";
g_Button[7].m_Remark = "Windows event viewer ";
g_Button[8].m_Remark = "An editor for binary files ";
g_Button[9].m_Remark = "Windows process viewer ";
g_Button[10].m_Remark = "Managing all the user sessions of WAC server ";
g_Button[11].m_Remark = "Managing local users and user groups on your server ";
g_Button[12].m_Remark = "Displaying system general information and device list ";
g_Button[13].m_Remark = "Quit this program ";
g_Button[0].m_HighKey = 6;
g_Button[1].m_HighKey = 4;
g_Button[2].m_HighKey = 6;
g_Button[3].m_HighKey = 7;
g_Button[4].m_HighKey = 7;
g_Button[5].m_HighKey = 10;
g_Button[6].m_HighKey = 4;
g_Button[7].m_HighKey = 6;
g_Button[8].m_HighKey = 5;
g_Button[9].m_HighKey = 5;
g_Button[10].m_HighKey = 10;
g_Button[11].m_HighKey = 6;
g_Button[12].m_HighKey = 10;
g_Button[13].m_HighKey = 10;
for(i=0; i<BUTTON_COUNT/2; i++){
if(i==0){
g_Button[0].m_ButtonY = 2*g_PosY + 2 * g_StepY + 1;//5 + g_PosY;
g_Button[0].m_ButtonX = g_StepX;//6 + g_PosX;
g_Button[0].m_ButtonLen = 24;
}else{
g_Button[i].m_ButtonY = g_Button[i-1].m_ButtonY + g_StepY;//3 ;
g_Button[i].m_ButtonX = g_Button[i-1].m_ButtonX;
g_Button[i].m_ButtonLen = g_Button[i-1].m_ButtonLen;
}
g_Button[i+BUTTON_COUNT/2].m_ButtonY = g_Button[i].m_ButtonY;
g_Button[i+BUTTON_COUNT/2].m_ButtonX = g_Button[i].m_ButtonX + g_Buffer.dwSize.X/2;
g_Button[i+BUTTON_COUNT/2].m_ButtonLen = g_Button[i].m_ButtonLen;
}
g_Window.SetDefaultButton(0);
}
BOOL WINDOW::SetDefaultButton(int SelectID)
{
if(SelectID<0 || SelectID>=BUTTON_COUNT)
return FALSE;
static int bFirst = 0;
if(bFirst){
m_OldDefaultButton = m_NewDefaultButton;
m_NewDefaultButton = SelectID;
}else{
bFirst = 1;
m_NewDefaultButton = 0;
m_OldDefaultButton = -1;
}
return TRUE;
}
// 处理鼠标移动事件
void ProcTimer(int x, int y, BOOL bLButtonDown)
{
if(bLButtonDown)
return;
int ButtonID = g_Window.GetButtonID(x,y);
g_Window.DrawRemark(ButtonID);
}
void InitScreen()
{
ConDrawPanel(0,0,g_Buffer.dwSize.X-1,0,TITLE_COLOR);
ConWriteText(14+g_PosX,0,"Welcome to Windows Access Server from Foxit Software",TITLE_COLOR);
ConWriteText(2+g_PosX,g_PosY+g_StepY,"WAC Server integrates a collection of great tools for remote administration.",BASIC_COLOR);
ConWriteText(2+g_PosX,g_PosY + 1+g_StepY,"Please click on any of the following buttons or press the highlighted key:",BASIC_COLOR);
for(int i=0; i<BUTTON_COUNT; i++){
g_Window.RedrawButton(i);
}
ConWriteText(2+g_PosX, g_Buffer.dwSize.Y-1, "Foxit Software WAC Server 2.0 Copyright (C) Foxit Software 2003", STATUS_COLOR);
ConDrawPanel(0,g_Buffer.dwSize.Y-1,g_Buffer.dwSize.X-1,g_Buffer.dwSize.Y-1,STATUS_COLOR);
g_Window.DrawRemark(0);
}
int WINDOW::GetButtonID(int PosX,int PosY)
{
for(int i=0; i<BUTTON_COUNT; i++){
if(PosY == g_Button[i].m_ButtonY && PosX >= g_Button[i].m_ButtonX &&
PosX < g_Button[i].m_ButtonX + g_Button[i].m_ButtonLen)
return i;
}
return -1;
}
void WINDOW::RedrawButton(int SelectID)
{
if(SelectID<0 || SelectID>=BUTTON_COUNT)
return ;
char* str = new char[g_Button[SelectID].m_ButtonLen+1];
memset(str,'\x20',g_Button[SelectID].m_ButtonLen);
str[g_Button[SelectID].m_ButtonLen] = 0;
memcpy(str+(g_Button[SelectID].m_ButtonLen-strlen(g_Button[SelectID].m_ButtonName))/2
,g_Button[SelectID].m_ButtonName,strlen(g_Button[SelectID].m_ButtonName));
if(g_Window.m_bPushed){
// 去掉两边默认标志
ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX,
g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);
ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX+g_Button[m_OldDefaultButton].m_ButtonLen-1,
g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);
ConScrollText(g_Button[SelectID].m_ButtonX,g_Button[SelectID].m_ButtonY
,g_Button[SelectID].m_ButtonX + g_Button[SelectID].m_ButtonLen
,g_Button[SelectID].m_ButtonY,1,0,BASIC_COLOR);
// 去掉底下阴影
memset(str, '\x20', g_Button[SelectID].m_ButtonLen);
str[g_Button[SelectID].m_ButtonLen] = 0;
ConWriteText(g_Button[SelectID].m_ButtonX+1,g_Button[SelectID].m_ButtonY+1,
str, BUTTON_BORDER_COLOR); // Button下边的阴影
}else{
ConWriteText(g_Button[SelectID].m_ButtonX,g_Button[SelectID].m_ButtonY
,str,BUTTON_COLOR); // 写上名字
ConDrawPanel(g_Button[SelectID].m_ButtonX+g_Button[SelectID].m_HighKey,g_Button[SelectID].m_ButtonY,
g_Button[SelectID].m_ButtonX+g_Button[SelectID].m_HighKey,g_Button[SelectID].m_ButtonY,HIGHKEY_COLOR);
if(SelectID==m_NewDefaultButton)
if(m_NewDefaultButton>=0 && m_NewDefaultButton<BUTTON_COUNT){
if(m_OldDefaultButton>=0 && m_OldDefaultButton<BUTTON_COUNT){
// 去掉两边默认标志
ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX,
g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);
ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX+g_Button[m_OldDefaultButton].m_ButtonLen-1,
g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);
// ConScrollText(g_Button[SelectID].m_ButtonX,g_Button[SelectID].m_ButtonY
// ,g_Button[SelectID].m_ButtonX + g_Button[SelectID].m_ButtonLen
// ,g_Button[SelectID].m_ButtonY,1,0,BASIC_COLOR);
}
// 写上新的默认标志
ConWriteText(g_Button[SelectID].m_ButtonX ,g_Button[SelectID].m_ButtonY,
"\x10", BUTTON_COLOR); // DefaultButton左边的标志
ConWriteText(g_Button[SelectID].m_ButtonX+g_Button[SelectID].m_ButtonLen-1,
g_Button[SelectID].m_ButtonY,"\x11", BUTTON_COLOR);
// DefaultButton右边的标志
}
ConWriteText(g_Button[SelectID].m_ButtonX + g_Button[SelectID].m_ButtonLen,g_Button[SelectID].m_ButtonY,
"\xdc", BUTTON_BORDER_COLOR); // Button右边的阴影
memset(str, '\xdf', g_Button[SelectID].m_ButtonLen);
str[g_Button[SelectID].m_ButtonLen] = 0;
ConWriteText(g_Button[SelectID].m_ButtonX+1,g_Button[SelectID].m_ButtonY+1,
str, BUTTON_BORDER_COLOR); // Button下边的阴影
}
delete str;
}
void SaveScreen()
{
if (g_pScrBuf == NULL) {
// Allocate buffer
g_hStdOut= CreateFile("CONOUT$",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
g_pScrBuf = new BYTE[sizeof(CHAR_INFO) * g_Buffer.dwSize.X * g_Buffer.dwSize.Y];
}
COORD size;
size.X = g_Buffer.dwSize.X;
size.Y = g_Buffer.dwSize.Y;
COORD pos;
pos.X = 0;
pos.Y = 0;
SMALL_RECT rect;
rect.Left = 0;
rect.Top = 0;
rect.Right = g_Buffer.dwSize.X-1;
rect.Bottom = g_Buffer.dwSize.Y-1;
ReadConsoleOutputW(g_hStdOut, (PCHAR_INFO)g_pScrBuf, size, pos, &rect);
}
void RestoreScreen()
{
COORD size;
size.X = g_Buffer.dwSize.X;
size.Y = g_Buffer.dwSize.Y;
COORD pos;
pos.X = 0;
pos.Y = 0;
SMALL_RECT rect;
rect.Left = 0;
rect.Top = 0;
rect.Right = g_Buffer.dwSize.X-1;
rect.Bottom = g_Buffer.dwSize.Y-1;
WriteConsoleOutputW(g_hStdOut, (PCHAR_INFO)g_pScrBuf, size, pos, &rect);
}
BOOL StartApp(LPCSTR AppName)
{
char AppPath[MAX_PATH];
strcpy(AppPath, g_ExePath);
strcat(AppPath, "\\");
strcat(AppPath, AppName);
ConLockInput();
SaveScreen();
STARTUPINFO si;
memset(&si, 0, sizeof si);
si.cb = sizeof si;
PROCESS_INFORMATION pi;
BOOL bRet = CreateProcess(AppPath, (char*)AppName, NULL, NULL, FALSE, 0, NULL, NULL,
&si, &pi);
if (!bRet) {
ConUnlockInput();
ConMessageBox("Sorry, can't start the application, please check your\n"
"WAC installation directory.", "Application Error");
return FALSE;
}
WaitForSingleObject(pi.hProcess, INFINITE);
RestoreScreen();
ConUnlockInput();
ConSetCursorInfo(15,FALSE);
return TRUE;
}
void WINDOW::DrawRemark(int SelectID)
{
if(SelectID == -1)
return;
static RemarkPosY = g_Button[BUTTON_COUNT/2-1].m_ButtonY + g_StepY;
if(RemarkPosY >=g_Buffer.dwSize.Y-1){
RemarkPosY = g_Buffer.dwSize.Y-3;
}
if(RemarkPosY <= g_Button[BUTTON_COUNT/2-1].m_ButtonY + 1){
RemarkPosY = g_Button[BUTTON_COUNT/2-1].m_ButtonY + 2;
}
if(SelectID==-1){
ConClearScreen(0,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY-1,
g_Buffer.dwSize.X-1,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY-1,BASIC_COLOR);
// ConClearScreen(0,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY,
// g_Buffer.dwSize.X-1,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY,BASIC_COLOR);
// ConWriteText(6+g_PosX,22+g_PosY," ",REMARK_COLOR);
return;
}
if(SelectID < 0 && SelectID >= BUTTON_COUNT)
return;
// ConClearScreen(0,22,79,23,REMARK_COLOR);
char* str = new char[g_Buffer.dwSize.X];
memcpy(str,g_Button[SelectID].m_Remark,g_Buffer.dwSize.X-5);
str[g_Buffer.dwSize.X-5] = 0;
ConWriteText(6+g_PosX,RemarkPosY,str,REMARK_COLOR);
if(strlen(g_Button[SelectID].m_Remark)>g_Buffer.dwSize.X-5){
memcpy(str,g_Button[SelectID].m_Remark + g_Buffer.dwSize.X-5,g_Buffer.dwSize.X-5);
str[g_Buffer.dwSize.X-5] = 0;
ConWriteText(6+g_PosX,RemarkPosY+1,str,REMARK_COLOR);
}
delete str;
}
BOOL WINDOW::SetCheckButton(int SelectID)
{
if(SelectID<0 || SelectID>=BUTTON_COUNT){
m_CheckButton = -1;
m_bPushed = FALSE;
return FALSE;
}
m_CheckButton = SelectID;
m_bPushed = TRUE;
return TRUE;
}
BOOL WINDOW::SetMousePosButton(int SelectID)
{
if(SelectID<0 || SelectID>=BUTTON_COUNT)
return FALSE;
static int bFirst = 0;
if(bFirst){
m_OldMousePosButton = m_NewDefaultButton;
m_NewMousePosButton = SelectID;
}else{
bFirst = 1;
m_NewMousePosButton = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -