【问题标题】:Visual Studio open cmd.exe with ConsolasVisual Studio 使用 Consolas 打开 cmd.exe
【发布时间】:2012-12-02 21:18:49
【问题描述】:

我有一个用 C 语言编写的程序,它正在 Visual Studio 2012 下开发。
我的程序使用了 Raster 字体中不可用的字符,因此我将 cmd.exe 字体更改为 Consolas,并且我的字符(á、é、í 等)正常工作。

但是,当我打开我的程序时,控制台仍然是 Raster 字体。我不知道我应该改变哪里才能让 Consolas 被全球接受。

提前致谢。

【问题讨论】:

  • 使用 SetCurrentConsoleFontEx()。无法在 XP 上运行。

标签: c character-encoding console visual-studio-2012 cmd


【解决方案1】:

这里是我从多个来源收集的一些代码。 允许我使用代码页,避免使用 unicode。 但是,wprintf() 等也应该可以工作。

目前只有 consolas 和 lucida console 可以工作。包括尝试获得类似大小。

检查包括 nFont 索引的有效性检查。 这可能是不需要的,在这种情况下,您可以省略对 kernel32 例程 GetNumberOfConsoleFonts() 的未记录调用。

Hans 说它不适用于 XP,docs 说最小 _WIN32_WINNT 是 0x500,其中包括 XP。还没试过。 一月

static void strcpytoW(WCHAR *dst, const char *src)
{
    WCHAR c;
    while ((c=*src++)!=0) *dst++=c;
    *dst=0;
}

/*************************************/

typedef DWORD (WINAPI *FN_NUMCONSOLEFONT)();
FN_NUMCONSOLEFONT GetNumberOfConsoleFonts;
static bool setfont(const HANDLE h, char *facename, CONSOLE_FONT_INFOEX &in,CONSOLE_FONT_INFOEX &out)
{
    in.cbSize=out.cbSize=sizeof(in);
    strcpytoW(in.FaceName,facename);
    if (!SetCurrentConsoleFontEx(h,FALSE,&in)) return false;
    HMODULE hm = ::GetModuleHandleA("KERNEL32.DLL"); 
    if (!hm) return false;
    GetNumberOfConsoleFonts = (FN_NUMCONSOLEFONT) GetProcAddress(hm, "GetNumberOfConsoleFonts");
    if (!GetNumberOfConsoleFonts) return false;
    DWORD numConsoleFonts=GetNumberOfConsoleFonts();
    if (!GetCurrentConsoleFontEx(h,FALSE,&out)) return false;
    return out.nFont>=0 && out.nFont<numConsoleFonts && _wcsicmp(in.FaceName,out.FaceName)==0;
}

/*************************************/

static char *set_console(char *facename,int page)
{
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_FONT_INFOEX fi={sizeof(fi),-1,{0,0},54,700},newfi;
    CONSOLE_FONT_INFO curfi;
    if (!GetCurrentConsoleFont(hStdout,FALSE,&curfi)) return NULL;
    for (fi.dwFontSize=curfi.dwFontSize;;fi.dwFontSize.Y++)
    {
        if (!setfont(hStdout,facename,fi,newfi))
        {
            facename="Lucida Console";
            if (!setfont(hStdout,facename,fi,newfi)) return NULL;
        }
        if (newfi.dwFontSize.X>=curfi.dwFontSize.X) break;
    }
    if (!SetConsoleOutputCP(page)) return NULL;
    return facename;
}

/*************************************/

int main(int argc, char *argv[])
{
    char *faceused;
    if ((faceused=set_console("Consolas",1252))!=NULL)
        printf("Console succesful, using %s\n",faceused);
    else puts("Console failed");
    puts("\x86 \x87 \xa7 \xa9 \xae \xb1 \xbc");

【讨论】:

    【解决方案2】:

    按 Ctrl-F5 开始执行程序。在返回 VS 之前,它会显示“按任意键...”。这使您有机会单击窗口的左上角、属性并将字体也更改为光栅字体。

    【讨论】:

    • 我知道,我做到了。虽然,当我将我的程序部署给其他人时,我希望它自动或通过 .reg 修改来执行此操作。
    • 糟糕。使用 Procmon 找出执行此操作时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多