我刚刚完成了项目的C#控制台应用程序代码,并希望为我的字体添加一些颜色。我希望能够使用自定义颜色 - 橙色。有没有办法做到这一点?
这是我过去用来改变颜色的代码,但它不提供橙色:
Console.ForegroundColor = ConsoleColor.Magenta(and so on);
有没有办法可以为颜色或类似的东西插入十六进制值?
答案 0 :(得分:26)
在http://msdn.microsoft.com/en-us/library/system.console.backgroundcolor.aspx
找到的列表我相信是控制台中唯一支持的颜色。不允许使用十六进制。
Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
修改强>
从公共回购中获取工作项目文件
https://bitbucket.org/benskolnick/color-console/
但是在进一步调查中,你可以做很多工作,将红色和黄色结合起来变成橙色。按照这里的例子。不会重新发布代码墙。
http://support.microsoft.com/kb/319883 击>
这不会让您获得更多颜色,但确实可以指导正确的方向。你需要做一些PINVOKE工作,但我很容易将橙色或任何其他RGB颜色变成控制台。
http://pinvoke.net/default.aspx/kernel32.SetConsoleScreenBufferInfoEx
// Copyright Alex Shvedov
// Modified by MercuryP with color specifications
// Use this code in any way you want
using System;
using System.Diagnostics; // for Debug
using System.Drawing; // for Color (add reference to System.Drawing.assembly)
using System.Runtime.InteropServices; // for StructLayout
class SetScreenColorsApp
{
[StructLayout(LayoutKind.Sequential)]
internal struct COORD
{
internal short X;
internal short Y;
}
[StructLayout(LayoutKind.Sequential)]
internal struct SMALL_RECT
{
internal short Left;
internal short Top;
internal short Right;
internal short Bottom;
}
[StructLayout(LayoutKind.Sequential)]
internal struct COLORREF
{
internal uint ColorDWORD;
internal COLORREF(Color color)
{
ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16);
}
internal COLORREF(uint r, uint g, uint b)
{
ColorDWORD = r + (g << 8) + (b << 16);
}
internal Color GetColor()
{
return Color.FromArgb((int) (0x000000FFU & ColorDWORD),
(int) (0x0000FF00U & ColorDWORD) >> 8, (int) (0x00FF0000U & ColorDWORD) >> 16);
}
internal void SetColor(Color color)
{
ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16);
}
}
[StructLayout(LayoutKind.Sequential)]
internal struct CONSOLE_SCREEN_BUFFER_INFO_EX
{
internal int cbSize;
internal COORD dwSize;
internal COORD dwCursorPosition;
internal ushort wAttributes;
internal SMALL_RECT srWindow;
internal COORD dwMaximumWindowSize;
internal ushort wPopupAttributes;
internal bool bFullscreenSupported;
internal COLORREF black;
internal COLORREF darkBlue;
internal COLORREF darkGreen;
internal COLORREF darkCyan;
internal COLORREF darkRed;
internal COLORREF darkMagenta;
internal COLORREF darkYellow;
internal COLORREF gray;
internal COLORREF darkGray;
internal COLORREF blue;
internal COLORREF green;
internal COLORREF cyan;
internal COLORREF red;
internal COLORREF magenta;
internal COLORREF yellow;
internal COLORREF white;
}
const int STD_OUTPUT_HANDLE = -11; // per WinBase.h
internal static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); // per WinBase.h
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe);
// Set a specific console color to an RGB color
// The default console colors used are gray (foreground) and black (background)
public static int SetColor(ConsoleColor consoleColor, Color targetColor)
{
return SetColor(consoleColor, targetColor.R, targetColor.G, targetColor.B);
}
public static int SetColor(ConsoleColor color, uint r, uint g, uint b)
{
CONSOLE_SCREEN_BUFFER_INFO_EX csbe = new CONSOLE_SCREEN_BUFFER_INFO_EX();
csbe.cbSize = (int)Marshal.SizeOf(csbe); // 96 = 0x60
IntPtr hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 7
if (hConsoleOutput == INVALID_HANDLE_VALUE)
{
return Marshal.GetLastWin32Error();
}
bool brc = GetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe);
if (!brc)
{
return Marshal.GetLastWin32Error();
}
switch (color)
{
case ConsoleColor.Black:
csbe.black = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkBlue:
csbe.darkBlue = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkGreen:
csbe.darkGreen = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkCyan:
csbe.darkCyan = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkRed:
csbe.darkRed = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkMagenta:
csbe.darkMagenta = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkYellow:
csbe.darkYellow = new COLORREF(r, g, b);
break;
case ConsoleColor.Gray:
csbe.gray = new COLORREF(r, g, b);
break;
case ConsoleColor.DarkGray:
csbe.darkGray = new COLORREF(r, g, b);
break;
case ConsoleColor.Blue:
csbe.blue = new COLORREF(r, g, b);
break;
case ConsoleColor.Green:
csbe.green = new COLORREF(r, g, b);
break;
case ConsoleColor.Cyan:
csbe.cyan = new COLORREF(r, g, b);
break;
case ConsoleColor.Red:
csbe.red = new COLORREF(r, g, b);
break;
case ConsoleColor.Magenta:
csbe.magenta = new COLORREF(r, g, b);
break;
case ConsoleColor.Yellow:
csbe.yellow = new COLORREF(r, g, b);
break;
case ConsoleColor.White:
csbe.white = new COLORREF(r, g, b);
break;
}
++csbe.srWindow.Bottom;
++csbe.srWindow.Right;
brc = SetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe);
if (!brc)
{
return Marshal.GetLastWin32Error();
}
return 0;
}
public static int SetScreenColors(Color foregroundColor, Color backgroundColor)
{
int irc;
irc = SetColor(ConsoleColor.Gray, foregroundColor);
if (irc != 0) return irc;
irc = SetColor(ConsoleColor.Black, backgroundColor);
if (irc != 0) return irc;
return 0;
}
}
然后如果你想使用橙色或任何其他颜色,你可以简单地调用SetScreenColor
static void Main(string[] args)
{
Color screenTextColor = Color.Orange;
Color screenBackgroundColor = Color.Black;
int irc = SetScreenColorsApp.SetScreenColors(screenTextColor, screenBackgroundColor);
Debug.Assert(irc == 0, "SetScreenColors failed, Win32Error code = " + irc + " = 0x" + irc.ToString("x"));
Debug.WriteLine("LargestWindowHeight=" + Console.LargestWindowHeight + " LargestWindowWidth=" + Console.LargestWindowWidth);
Debug.WriteLine("BufferHeight=" + Console.BufferHeight + " WindowHeight=" + Console.WindowHeight + " BufferWidth=" + Console.BufferWidth + " WindowWidth=" + Console.WindowWidth);
//// these are relative to the buffer, not the screen:
//Debug.WriteLine("WindowTop=" + Console.WindowTop + " WindowLeft=" + Console.WindowLeft);
Debug.WriteLine("ForegroundColor=" + Console.ForegroundColor + " BackgroundColor=" + Console.BackgroundColor);
Console.WriteLine("Some text in a console window");
Console.BackgroundColor = ConsoleColor.Cyan;
Console.ForegroundColor = ConsoleColor.Yellow;
Debug.WriteLine("ForegroundColor=" + Console.ForegroundColor + " BackgroundColor=" + Console.BackgroundColor);
Console.Write("Press ENTER to exit...");
Console.ReadLine();
// Note: If you use SetScreenColors, the RGB values of gray and black are changed permanently for the console window.
// Using i.e. Console.ForegroundColor = ConsoleColor.Gray afterwards will switch the color to whatever you changed gray to
// It's best to use SetColor for the purpose of choosing the 16 colors you want the console to be able to display, then use
// Console.BackgroundColor and Console.ForegrondColor to choose among them.
}
答案 1 :(得分:12)
[无耻的自我推销]
我正在开发一个项目,允许您在任何System.Drawing.Color中设置控制台输出的样式,包括橙色。这是你如何做到的:
Console.WriteLine("writing to the console in orange", Color.Orange);
答案 2 :(得分:9)
自Windows 10周年更新以来,控制台可以使用ANSI / VT100颜色代码
使用序列:
“\ X1B [48; 5;” + s +“m” - 按表(0-255)中的索引设置背景颜色
“\ X1B [38; 5;” + s +“m” - 按表(0-255)中的索引设置前景色
“\ X1B [48; 2;” + r +“;” + g +“;”+ b +“m” - 用r,g,b值设置背景
“\ X1B [38; 2;” + r +“;” + g +“;”+ b +“m” - 按r,g,b值设置前景
重要通知:内部Windows在表格中只有256(或88)种颜色,Windows将最接近表格中的(r,g,b)值。
示例代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
[DllImport( "kernel32.dll", SetLastError = true )]
public static extern bool SetConsoleMode( IntPtr hConsoleHandle, int mode );
[DllImport( "kernel32.dll", SetLastError = true )]
public static extern bool GetConsoleMode( IntPtr handle, out int mode );
[DllImport( "kernel32.dll", SetLastError = true )]
public static extern IntPtr GetStdHandle( int handle );
static void Main( string[] args )
{
var handle = GetStdHandle( -11 );
int mode;
GetConsoleMode( handle, out mode );
SetConsoleMode( handle, mode | 0x4 );
for (int i=0;i<255;i++ )
{
Console.Write( "\x1b[48;5;" + i + "m*" );
}
Console.ReadLine();
}
}
}
结果:
Read about it in MSDN: Article 'Console Virtual Terminal Sequences'
答案 3 :(得分:3)
迟到总比没有好,但似乎现在可以在Vista上使用,至少可以。因此,我将添加此内容以供将来参考其他人使用相同的问题。
当我想要这样做时,我遇到了Hans Passant的reply on MSDN:
我现在无法访问Vista,因此无法尝试。但有些事情 这样应该有效:
CONSOLE_SCREEN_BUFFER_INFOEX info; info.cbSize = sizeof(info); HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfoEx(hConsole, &info); info.ColorTable[14] = RGB(255, 128, 0); // Replace yellow SetConsoleScreenBufferInfoEx(hConsole, &info); SetConsoleTextAttribute(hConsole, FOREGROUNDINTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
这需要一些p-Invoking但是应该给你一些东西继续。
答案 4 :(得分:3)
扩展Alexei Shcherbakov的答案Windows 10 ENABLE_VIRTUAL_TERMINAL_PROCESSING这里是一个完整的颜色代码映射,因此您可以将所有颜色及其各自的数字放在一个位置:
答案 5 :(得分:2)
你可以使用Colorful.Console让你使用自定义颜色,甚至还有让你制作ASCII艺术的Figlet字体!
答案 6 :(得分:1)
它不是橙色,因为该颜色不是控制台支持的颜色之一。我的意思是,即使使用Windows API也无法获得它。如果您想验证它,请查看以下代码:
public static class Win32
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetConsoleTextAttribute(IntPtr hConsoleOutput, short attributes);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
}
public class Program
{
static void Main(string[] args)
{
foreach(var i in Enumerable.Range(0, 100)) // why "100"? it is just any number
{
Win32.SetConsoleTextAttribute(Win32.GetStdHandle(-11), (short)i);
Console.WriteLine("Hello");
}
}
}
答案 7 :(得分:1)
进一步证明这不起作用(使用Benjamin链接中的方法):
using System.Runtime.InteropServices;
namespace
{
class Program
{
[DllImport("kernel32.dll")]
public static extern bool SetConsoleTextAttribute(IntPtr hConsoleOutput, int wAttributes);
[DllImport("kernel32.dll")]
public static extern IntPtr GetStdHandle(uint nStdHandle);
static void Main(string[] args)
{
uint STD_OUTPUT_HANDLE = 0xfffffff5;
IntPtr hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, (int)Colour.Red + (int)Colour.Green + (int)Colour.Intensity);
Console.WriteLine("Red + Green + Intensity == Yellow");
SetConsoleTextAttribute(hConsole, (int)Colour.Red + (int)Colour.Green + (int)Colour.Intensity + (int)Colour.Red);
Console.WriteLine("Yellow + Red != Orange");
SetConsoleTextAttribute(hConsole, 15);
Console.WriteLine();
Console.WriteLine("Press Enter to exit ...");
Console.Read();
}
public enum Colour
{
Blue = 0x00000001,
Green = 0x00000002,
Red = 0x00000004,
Intensity = 0x00000008
}
}
}
此方法不允许您添加通过ConsoleColor无法访问的任何内容。这真是一种耻辱,因为我也喜欢在我的应用程序中添加橙色。如果有人找到了我会非常感兴趣的方式。
答案 8 :(得分:0)
using System;
using Microsoft.Win32;
namespace colorChanger
{
class Program
{
static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Hello World");
RegistryKey regKey = Registry.CurrentUser.CreateSubKey("Console");
regKey.SetValue("ColorTable10", 42495, RegistryValueKind.DWord);
Console.ReadKey();
}
}
}
当然可以与所有其他ColorTable-Values和Colorcodes一起使用,但仅针对您PC上的用户更改。
答案 9 :(得分:-3)
控制台API不支持自定义颜色。
您可以通过用户界面(右键单击控制台标题栏,设置,颜色)