console.c
来自「一个类似windows」· C语言 代码 · 共 1,044 行 · 第 1/2 页
C
1,044 行
return FALSE;
}
NTSTATUS
SetConsoleMode(HANDLE hConsoleHandle,
ULONG dwMode)
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
CONSOLE_MODE Buffer;
Buffer.dwMode = dwMode;
Status = NtDeviceIoControlFile(hConsoleHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_SET_MODE,
&Buffer,
sizeof(CONSOLE_MODE),
NULL,
0);
return(Status);
}
#endif
NTSTATUS
ConGetConsoleScreenBufferInfo(PCONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo)
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO,
NULL,
0,
ConsoleScreenBufferInfo,
sizeof(CONSOLE_SCREEN_BUFFER_INFO));
return(Status);
}
NTSTATUS
ConSetConsoleCursorInfo(PCONSOLE_CURSOR_INFO lpConsoleCursorInfo)
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_SET_CURSOR_INFO,
(PCONSOLE_CURSOR_INFO)lpConsoleCursorInfo,
sizeof(CONSOLE_CURSOR_INFO),
NULL,
0);
return(Status);
}
NTSTATUS
ConSetConsoleCursorPosition(COORD dwCursorPosition)
{
CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
Status = ConGetConsoleScreenBufferInfo(&ConsoleScreenBufferInfo);
if (!NT_SUCCESS(Status))
return(Status);
ConsoleScreenBufferInfo.dwCursorPosition.X = dwCursorPosition.X;
ConsoleScreenBufferInfo.dwCursorPosition.Y = dwCursorPosition.Y;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,
&ConsoleScreenBufferInfo,
sizeof(CONSOLE_SCREEN_BUFFER_INFO),
NULL,
0);
return(Status);
}
NTSTATUS
ConSetConsoleTextAttribute(USHORT wAttributes)
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE,
&wAttributes,
sizeof(USHORT),
NULL,
0);
return(Status);
}
VOID
ConInKey(PINPUT_RECORD Buffer)
{
while (TRUE)
{
ConReadConsoleInput(Buffer);
if ((Buffer->EventType == KEY_EVENT) &&
(Buffer->Event.KeyEvent.bKeyDown == TRUE))
break;
}
}
VOID
ConOutChar(CHAR c)
{
ULONG Written;
ConWriteConsole(&c,
1,
&Written);
}
VOID
ConOutPuts(LPSTR szText)
{
ULONG Written;
ConWriteConsole(szText,
strlen(szText),
&Written);
ConWriteConsole("\n",
1,
&Written);
}
VOID
ConOutPrintf(LPSTR szFormat, ...)
{
CHAR szOut[256];
DWORD dwWritten;
va_list arg_ptr;
va_start(arg_ptr, szFormat);
vsprintf(szOut, szFormat, arg_ptr);
va_end(arg_ptr);
ConWriteConsole(szOut,
strlen(szOut),
&dwWritten);
}
SHORT
GetCursorX(VOID)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
ConGetConsoleScreenBufferInfo(&csbi);
return(csbi.dwCursorPosition.X);
}
SHORT
GetCursorY(VOID)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
ConGetConsoleScreenBufferInfo(&csbi);
return(csbi.dwCursorPosition.Y);
}
VOID
GetScreenSize(SHORT *maxx,
SHORT *maxy)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
ConGetConsoleScreenBufferInfo(&csbi);
if (maxx)
*maxx = csbi.dwSize.X;
if (maxy)
*maxy = csbi.dwSize.Y;
}
VOID
SetCursorType(BOOL bInsert,
BOOL bVisible)
{
CONSOLE_CURSOR_INFO cci;
cci.dwSize = bInsert ? 10 : 99;
cci.bVisible = bVisible;
ConSetConsoleCursorInfo(&cci);
}
VOID
SetCursorXY(SHORT x,
SHORT y)
{
COORD coPos;
coPos.X = x;
coPos.Y = y;
ConSetConsoleCursorPosition(coPos);
}
VOID
ClearScreen(VOID)
{
COORD coPos;
ULONG Written;
coPos.X = 0;
coPos.Y = 0;
FillConsoleOutputAttribute(0x17,
xScreen * yScreen,
coPos,
&Written);
FillConsoleOutputCharacter(' ',
xScreen * yScreen,
coPos,
&Written);
}
VOID
SetStatusText(char* fmt, ...)
{
char Buffer[128];
va_list ap;
COORD coPos;
ULONG Written;
va_start(ap, fmt);
vsprintf(Buffer, fmt, ap);
va_end(ap);
coPos.X = 0;
coPos.Y = yScreen - 1;
FillConsoleOutputAttribute(0x70,
xScreen,
coPos,
&Written);
FillConsoleOutputCharacter(' ',
xScreen,
coPos,
&Written);
WriteConsoleOutputCharacters(Buffer,
strlen(Buffer),
coPos);
}
VOID
InvertTextXY(SHORT x, SHORT y, SHORT col, SHORT row)
{
COORD coPos;
ULONG Written;
for (coPos.Y = y; coPos.Y < y + row; coPos.Y++)
{
coPos.X = x;
FillConsoleOutputAttribute(0x71,
col,
coPos,
&Written);
}
}
VOID
NormalTextXY(SHORT x, SHORT y, SHORT col, SHORT row)
{
COORD coPos;
ULONG Written;
for (coPos.Y = y; coPos.Y < y + row; coPos.Y++)
{
coPos.X = x;
FillConsoleOutputAttribute(0x17,
col,
coPos,
&Written);
}
}
VOID
SetTextXY(SHORT x, SHORT y, PCHAR Text)
{
COORD coPos;
coPos.X = x;
coPos.Y = y;
WriteConsoleOutputCharacters(Text,
strlen(Text),
coPos);
}
VOID
SetInputTextXY(SHORT x, SHORT y, SHORT len, PWCHAR Text)
{
COORD coPos;
ULONG Length;
ULONG Written;
coPos.X = x;
coPos.Y = y;
Length = wcslen(Text);
if (Length > (ULONG)len - 1)
{
Length = len - 1;
}
ConFillConsoleOutputAttribute(0x70,
len,
coPos,
&Written);
ConWriteConsoleOutputCharactersW(Text,
Length,
coPos);
coPos.X += Length;
ConFillConsoleOutputCharacter('_',
1,
coPos,
&Written);
if ((ULONG)len > Length + 1)
{
coPos.X++;
ConFillConsoleOutputCharacter(' ',
len - Length - 1,
coPos,
&Written);
}
}
VOID
SetUnderlinedTextXY(SHORT x, SHORT y, PCHAR Text)
{
COORD coPos;
ULONG Length;
ULONG Written;
coPos.X = x;
coPos.Y = y;
Length = strlen(Text);
ConWriteConsoleOutputCharacters(Text,
Length,
coPos);
coPos.Y++;
ConFillConsoleOutputCharacter(0xCD,
Length,
coPos,
&Written);
}
VOID
SetInvertedTextXY(SHORT x, SHORT y, PCHAR Text)
{
COORD coPos;
ULONG Length;
ULONG Written;
coPos.X = x;
coPos.Y = y;
Length = strlen(Text);
ConFillConsoleOutputAttribute(0x71,
Length,
coPos,
&Written);
ConWriteConsoleOutputCharacters(Text,
Length,
coPos);
}
VOID
SetHighlightedTextXY(SHORT x, SHORT y, PCHAR Text)
{
COORD coPos;
ULONG Length;
ULONG Written;
coPos.X = x;
coPos.Y = y;
Length = strlen(Text);
ConFillConsoleOutputAttribute(0x1F,
Length,
coPos,
&Written);
ConWriteConsoleOutputCharacters(Text,
Length,
coPos);
}
VOID
PrintTextXY(SHORT x, SHORT y, char* fmt, ...)
{
char buffer[512];
va_list ap;
COORD coPos;
va_start(ap, fmt);
vsprintf(buffer, fmt, ap);
va_end(ap);
coPos.X = x;
coPos.Y = y;
ConWriteConsoleOutputCharacters(buffer,
strlen(buffer),
coPos);
}
VOID
PrintTextXYN(SHORT x, SHORT y, SHORT len, char* fmt, ...)
{
char buffer[512];
va_list ap;
COORD coPos;
ULONG Length;
ULONG Written;
va_start(ap, fmt);
vsprintf(buffer, fmt, ap);
va_end(ap);
coPos.X = x;
coPos.Y = y;
Length = strlen(buffer);
if (Length > (ULONG)len - 1)
{
Length = len - 1;
}
ConWriteConsoleOutputCharacters(buffer,
Length,
coPos);
coPos.X += Length;
if ((ULONG)len > Length)
{
ConFillConsoleOutputCharacter(' ',
len - Length,
coPos,
&Written);
}
}
/* EOF */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?