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

时间:2018-12-23 15:00:22

标签: c++ winapi fonts console window

我正在尝试将一种控制台字体更改为一种自定义字体,但是尽管这是我尝试在Internet上寻找解决方案时想到的,但是此特定代码段似乎并没有完成任何事情。我通过手工安装并将其添加到控制台中,使用此自定义字体仅对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;

}

1 个答案:

答案 0 :(得分:4)

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

不幸的是,控制台窗口不是您的过程的一部分(GetWindowThreadProcessId()就在于此!)。它由系统进程托管(Win 7之前为“ csrss.exe”,此后为“ conhost.exe”。)

请参阅:Windows Command-Line: Inside the Windows Console

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