Как получить имя шрифта как в Windows Реестре с C#? - PullRequest
0 голосов
/ 01 февраля 2020

Первая попытка

Вот что мы получаем для шрифта Arial TTF:

Вот что мы получаем для шрифта Sitka TT C :

А вот что мы получаем для шрифта SimSun TT C:

Я пытался использовать OpenFontReader объект из пакета Typography.OpenFont.NetCore .

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Typography.OpenFont;

namespace MyApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var fontName1 = GetRegistryFontName(@"C:\Windows\Fonts\arial.ttf");
            var fontName2 = GetRegistryFontName(@"C:\Windows\Fonts\Sitka.ttc");
            var fontName3 = GetRegistryFontName(@"C:\Windows\Fonts\simsun.ttc");

            Console.WriteLine("Press a key to exit...");
            Console.ReadKey();
        }

        static string GetRegistryFontName(string fontFile)
        {
            var fontReader = new OpenFontReader();
            var fontInfo = fontReader.ReadPreview(File.OpenRead(fontFile));

            var fontExtension = Path.GetExtension(fontFile).ToLower();
            var fontTypeSuffix = (fontExtension == ".otc" || fontExtension == ".otf") ? "(OpenType)" : "(TrueType)";

            if (fontExtension == ".otf" || fontExtension == ".ttf")
            {
                return $"{fontInfo.Name} {fontInfo.SubFamilyName} {fontTypeSuffix}";
            }
            else if (fontExtension == ".otc" || fontExtension == ".ttc")
            {
                var fontNames = fontInfo.Name.Split(",").Skip(1).ToArray();
                var result = new StringBuilder(fontNames[0]);

                foreach (var fontName in fontNames[1..^1])
                {
                    result.Append($" & {fontName}");
                }

                result.Append($" & {fontNames[^1]} {fontTypeSuffix}");

                return result.ToString();
            }

            return null;
        }
    }
}

И вот результат:

Это почти работает, но есть две проблемы:

  • Имя для шрифта arial.ttf в реестре Arial (TrueType) и Arial Normal (TrueType) в моем результате.
  • Я получаю Азиатское имя для шрифта simsun.ttc с OpenFontReader.

Вторая попытка

Я попытался с помощью fontview и пакета FlaUI .

using FlaUI.Core;
using FlaUI.Core.Tools;
using FlaUI.UIA3;
using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace MyApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var fontName1 = GetRegistryFontName(@"C:\Windows\Fonts\arial.ttf");

            Console.WriteLine("Press a key to exit...");
            Console.ReadKey();
        }

        static string GetRegistryFontName(string fontFile)
        {
            var psi = new ProcessStartInfo()
            {
                FileName = "fontview",
                Arguments = fontFile
            };

            string fontName = null;
            var app = Application.Launch(psi);
            using (var automation = new UIA3Automation())
            {
                var window = Retry.WhileNull(() =>
                    app.GetMainWindow(automation),
                    TimeSpan.FromSeconds(10)
                ).Result;

                window.SetTransparency(0);
                window.Focus();

                fontName = window.Title;

                window.Close();
            }

            return fontName;
        }
    }
}

Результат еще более странный:

Шрифт Arial теперь является шрифтом OpenType. Спасибо Windows. :)


У вас есть решение для восстановления того же имени, что и в реестре?
Оно должно работать с любым шрифтом, даже внешним, и с. NET Core.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...