AddFontResource + SetCurrentConsoleFontEx 不会更改控制台字体

AddFontResource + SetCurrentConsoleFontEx are not changing a console font

本文关键字:控制台 字体 SetCurrentConsoleFontEx AddFontResource      更新时间:2023-10-16

我正在尝试将控制台字体更改为自定义字体,但是这个特定的代码片段似乎没有任何帮助,即使这是我在尝试在互联网上寻找解决方案时想到的。我只用这种自定义字体测试了 SetCurrentConsoleFontEx,方法是手动安装它并将其添加到控制台中,它一直运行正常。

#include <iostream>
#include <Windows.h>
int main()
{
    std::cout << "Default font" << std::endl;
    system("pause");
    HANDLE m_stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    AddFontResourceEx(L"Iosevka.ttf", FR_PRIVATE, 0);
    SendNotifyMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    CONSOLE_FONT_INFOEX cfie;
    ZeroMemory(&cfie, sizeof(cfie));
    cfie.cbSize = sizeof(cfie);
    cfie.dwFontSize.Y = 21;
    lstrcpyW(cfie.FaceName, L"Iosevka");
    SetCurrentConsoleFontEx(m_stdOut, false, &cfie);
    std::cout << "Custom font" << std::endl;
    RemoveFontResource(L"Iosevka.ttf");
    system("pause");
    return 0;
}

您正在使用FR_PRIVATE标志调用AddFontResourceEx(),这意味着该字体仅适用于您的进程。

不幸的是,控制台窗口不是您的进程的一部分(GetWindowThreadProcessId()在这方面!它由一个系统进程(Win 7之前的"csrss.exe",从那时起"conhost.exe")托管。

请参阅:Windows 命令行:在 Windows 控制台内部

若要使字体可用于控制台,必须删除 FR_PRIVATE 标志或永久安装字体。