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 + -
显示快捷键?