首页  编辑  

常用的控制台函数

Tags: /超级猛料/Console.控制台程序/   Date Created:
//////////////////////////////////////////////////////////////////////////////
// Console function & procedure
//////////////////////////////////////////////////////////////////////////////
function IsOnConsole: Boolean; stdcall;
{ 判断程序是否是在控制台下面运行,还是单独直接打开,必须在程序的第一行调用本函数 并且保存返回的值,否则可能判断发生错误! }
var
	sbi: TConsoleScreenBufferInfo;
	h: THandle;
begin
	h := GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(h, sbi);
	Result := not (sbi.dwCursorPosition.X > 0) and (sbi.dwCursorPosition.Y > 0);
end;

function EnableEcho(const Enable: Boolean): Cardinal; stdcall;
{
 指定是否回显输入的字符,例如需要输入密码,不需要显示的情况
 Enable : True ,回显, False ,不回显
 返回值:返回被修改前的控制台模式
}
var
	StdHandle: THandle;
begin
	StdHandle := GetStdHandle(STD_INPUT_HANDLE);
	if StdHandle = INVALID_HANDLE_VALUE then Exit;
	GetConsoleMode(StdHandle, Result);
	if Enable then
		SetConsoleMode(StdHandle, Result or ENABLE_ECHO_INPUT)
	else
		SetConsoleMode(StdHandle, Result and not ENABLE_ECHO_INPUT);
end;

procedure ClearScreen;
{ 清屏 }
var
	sbi: TConsoleScreenBufferInfo;
	h: hwnd;
	Cord: _COORD;
	R: Cardinal;
begin
	h := GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(h, sbi);
	Cord.X := 0;
	Cord.Y := 0;
	FillConsoleOutputCharacter(h, ' ', sbi.dwSize.X * sbi.dwSize.Y, Cord, R);
	SetConsoleCursorPosition(h, Cord);
end;

function KeyPressed: Char;
{ 判断是否有任意键(不包括功能键!)按下,返回按下的键的字符 }
var
	Console: Cardinal;
	OldMode: Cardinal;
	BufferSize: Cardinal;
begin
	Console := GetStdHandle(STD_INPUT_HANDLE);
	GetConsoleMode(Console, OldMode);  { 获取原模式 }
	SetConsoleMode(Console, OldMode and not (ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT));
	ReadConsole(Console, @Result, 1, BufferSize, nil);
	SetConsoleMode(Console, OldMode);  { 恢复原来模式 }
end;

procedure PressAnyKey;
{ 提示按任意键继续 !}
const
	PressAnyKey = 'Press any key to continue...';
var
	BufferSize: Cardinal;
begin
	WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(PressAnyKey),Length(PressAnyKey), BufferSize, nil);
	KeyPressed;
end;

procedure GotoXY(X, Y: Word);
{ 移动输入光标焦点到指定的坐标范围 }
var
	Coord: _COORD;
begin
	Coord.X := X;
	Coord.Y := Y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coord);
end;

function WhereXY: TCoord;
{ 获取当前光标位置 }
var
	Info: _CONSOLE_SCREEN_BUFFER_INFO;
begin
	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), Info);
	Result := Info.dwCursorPosition;
end;

function WhereX: SmallInt;
{ 返回当前光标 X 坐标:结果范围 0~25}
begin
	Result := WhereXY.X;
end;

function WhereY: SmallInt;
{ 返回当前光标 Y 坐标:结果范围 0~80}
begin
	Result := WhereXY.Y;
end;

function SetColor(Color: Word): DWORD;
{ 设置输出文本颜色 }
var
	Info: CONSOLE_SCREEN_BUFFER_INFO;
begin
	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), Info);
	Result := Info.wAttributes;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), Info.wAttributes or Color);
end;