博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#更改控制台文本的前景色和背景色
阅读量:5262 次
发布时间:2019-06-14

本文共 7201 字,大约阅读时间需要 24 分钟。

关键字:C# NET 控制台 前景色 背景色

地址:

 

This step-by-step article describes how to change the foreground and background colors of the text that is written to the Console window by using Visual C#.

This article describes how to save the original settings of the Console window as the program starts, how to modify the color settings, and how to restore the colors to their original values as the program quits. 

Introduction

To change the foreground and background colors of text that the Console window displays, use the SetConsoleTextAttributeWin32 application programming interface (API) function. This function sets the attributes of the characters that are written to the screen buffer. 

When you change these attributes at run time, the changes are valid for as long as the Console window is open. If you close and reopen the Console window, the attributes are reset to their default values. If you execute the program from a command line in a Console window that is already running, changes that you make to the text attributes are valid for that Console window for as long as the window is open, even after your program quits. Therefore, an program should restore the original color attributes before the program quits. 
You can obtain the text attributes of the Console window by using the GetConsoleScreenBufferInfo API function. This function fills an instance of the CONSOLE_SCREEN_BUFFER_INFO structure with information about the current output buffer settings. ThewAttribute parameter of this structure contains the color information that defines the foreground and background colors of the text. The possible colors are any color combination that can be created by combining red, green, and blue.

OriginalColors = ConsoleInfo.wAttributes;   SetConsoleTextAttribute(hConsoleHandle, color);

You can use the ResetColor method to reset the output buffer attributes of the Console window to the original values that are captured when the program begins its execution.

SetConsoleTextAttribute(hConsoleHandle, OriginalColors);

Step-by-Step Example

  1. In Visual Studio .NET or Visual Studio 2005, create an new Visual C# Console Application project.
  2. In Solution Explorer, right-click your project, click Add, and then select Add Class to add a new class to your program.
  3. Paste the following sample code in the class that is created. Verify that the sample code replaces all of existing the code in the class.
using System;   using System.Runtime.InteropServices;   namespace ConsoleColor   {      /// Summary description for Class2.      public class Class2      {         private int hConsoleHandle;         private COORD ConsoleOutputLocation;         private CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;         private int OriginalColors;         private const int  STD_OUTPUT_HANDLE = -11;         [DllImport("kernel32.dll", EntryPoint="GetStdHandle", SetLastError=true,                         CharSet=CharSet.Auto,                         CallingConvention=CallingConvention.StdCall)]        private static extern int GetStdHandle(int nStdHandle);         [DllImport("kernel32.dll", EntryPoint="GetConsoleScreenBufferInfo",                         SetLastError=true, CharSet=CharSet.Auto,                         CallingConvention=CallingConvention.StdCall)]        private static extern int GetConsoleScreenBufferInfo(int hConsoleOutput,                         ref CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);         [DllImport("kernel32.dll", EntryPoint="SetConsoleTextAttribute",                         SetLastError=true, CharSet=CharSet.Auto,                         CallingConvention=CallingConvention.StdCall)]        private static extern int SetConsoleTextAttribute(int hConsoleOutput,                                 int wAttributes);          public enum Foreground         {                        Blue = 0x00000001,            Green = 0x00000002,            Red = 0x00000004,            Intensity = 0x00000008         }         public enum Background         {            Blue = 0x00000010,            Green = 0x00000020,            Red = 0x00000040,            Intensity = 0x00000080         }         [StructLayout(LayoutKind.Sequential)] private struct COORD         {            short X;            short Y;         }                     [StructLayout(LayoutKind.Sequential)] private struct SMALL_RECT         {            short Left;            short Top;            short Right;            short Bottom;         }         [StructLayout(LayoutKind.Sequential)] private struct CONSOLE_SCREEN_BUFFER_INFO         {            public COORD dwSize;            public COORD dwCursorPosition;            public int wAttributes;            public SMALL_RECT srWindow;            public COORD dwMaximumWindowSize;         }         // Constructor.         public Class2()         {            ConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();            ConsoleOutputLocation = new COORD();            hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);            GetConsoleScreenBufferInfo(hConsoleHandle, ref ConsoleInfo);            OriginalColors = ConsoleInfo.wAttributes;         }                 public void TextColor(int color)         {            SetConsoleTextAttribute(hConsoleHandle, color);         }                 public void ResetColor()         {            SetConsoleTextAttribute(hConsoleHandle, OriginalColors);         }      }   }

  4. Paste the following sample code in the class file that contains the Main function. Verify that the sample code replaces all of the existing code in the file.

using System;   namespace ConsoleColor   {      class Class1      {         [STAThread]         static void Main(string[] args)         {            Class2 TextChange = new Class2();            Console.WriteLine("Original Colors");            Console.WriteLine("Press Enter to Begin");            Console.ReadLine();            TextChange.TextColor((int)Class2.Foreground.Green +                                 (int)Class2.Foreground.Intensity);            Console.WriteLine("THIS TEXT IS GREEN");            Console.WriteLine("Press Enter to change colors again");            Console.ReadLine();            TextChange.TextColor((int)Class2.Foreground.Red +                                 (int)Class2.Foreground.Blue +                                 (int)Class2.Foreground.Intensity);            Console.WriteLine("NOW THE TEXT IS PURPLE");            Console.WriteLine("Press Enter to change colors again");            Console.ReadLine();            TextChange.TextColor((int)Class2.Foreground.Blue +                                 (int)Class2.Foreground.Intensity +                                 (int)Class2.Background.Green +                                 (int)Class2.Background.Intensity);            Console.WriteLine("NOW THE TEXT IS BLUE AND BACKGROUND OF IT IS GREEN");            Console.WriteLine("Press Enter change everything back to normal");            Console.ReadLine();            TextChange.ResetColor();            Console.WriteLine("Back to Original Colors");            Console.WriteLine("Press Enter to Terminate");            Console.ReadLine();     }      }   }

 

转载于:https://www.cnblogs.com/txw1958/archive/2012/12/07/csharp-console-color.html

你可能感兴趣的文章
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
C# GC 垃圾回收机制
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
理解git对象
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Apache配置反向代理、负载均衡和集群(mod_proxy方式)
查看>>
Linux编程简介——gcc
查看>>
一种高效的序列化方式——MessagePack
查看>>
2019年春季学期第四周作业
查看>>
2019春第十周作业
查看>>