C#从运行时设置控制台字体和字体大小

时间:2017-10-31 07:23:35

标签: c# dll struct fonts console-application

我正在尝试在控制台应用程序中创建Rougelike。 我想将运行时的字体和字体大小分别设置为MS Gothic和36。

我尝试使用代码SetCurrentConsoleFontEx找到HERE

我没有运气编辑结构的字段所以我猜测结构是不可变的?要解决这个问题,我可以将结构更改为类或使结构可变吗?

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices; //required to import dll

namespace RPLike
{


    [StructLayout(LayoutKind.Sequential)]
    public struct COORD
    {
        public short X;
        public short Y;

        public COORD(short X, short Y)
        {
            this.X = X;
            this.Y = Y;
        }
    };

    [StructLayout(LayoutKind.Sequential)]
    public struct CONSOLE_FONT_INFO_EX
    {
        public COORD dwFontSize;
        public ushort FontFamily;

        UInt64 face0, face1, face2, face3, face4, face5, face6, face7;
    }


    class Program
    {
        COORD COORD = (18,36); //pixel dimensions of MS Gothic at 36 font size
        CONSOLE_FONT_INFO_EX FontFamily = 4; //MS Gothic is the 5th option of font

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool SetCurrentConsoleFontEx(IntPtr ConsoleOutput, bool MaximumWindow, CONSOLE_FONT_INFO_EX ConsoleCurrentFontEx);
        //import the pointers required to edit console font.. I think?


        static void Main(string[] args)

我目前遇到错误:

CS8179  Predefined type 'System.ValueTuple`2' is not defined or imported
CS0029  Cannot implicitly convert type '(int, int)' to 'RPLike.COORD'
CS0029  Cannot implicitly convert type 'int' to 'RPLike.CONSOLE_FONT_INFO_EX'

THIS帖子提及"自Vista以来,有可能做你想要的SetCurrentConsoleFontEx,如果你可以使用Console类。"但没有描述或提供任何如何实现该功能的例子。

THIS论坛帖子列出了另一种方法。我的问题是这只适用于c ++还是可以修改为在c#中工作? void setFontSize(int FontSize)

{
    CONSOLE_FONT_INFOEX info = {0};
    info.cbSize       = sizeof(info);
    info.dwFontSize.Y = FontSize; // leave X as zero
    info.FontWeight   = FW_NORMAL;
    wcscpy(info.FaceName, L"Lucida Console");
    SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), NULL, &info);
}

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

当时(2017年10月)无法做到这一点,因为C# Console Class中没有可满足您要求的此类财产或方法。

我想引用this answer by Paul Turner的一部分:

  

[...]如果你想对所使用的字体有绝对的控制权,你应该考虑升级到Windows应用程序,因为这样可以让你轻松地创建一个文本窗口并对你想要的字体和颜色做任何你想做的事情。使用

因此,您可以考虑使用Windows窗体,并模拟"控制台"带有black background的标签和您希望的font  properties(也可以通过Windows窗体设计器设置,而不仅仅是以编程方式设置)