c++ 无法使用虚拟终端序列更改控制台应用程序窗口标题

qgelzfjb  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(165)

我读了微软的this article关于控制台虚拟终端序列的使用。
我按照以下顺序更改窗口标题:

ESC ] 2 ; <string> BEL

我也试过:

ESC ] 0 ; <string> BEL

但它不会改变标题。
这是我的代码:

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return GetLastError();
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return GetLastError();
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return GetLastError();
    }

    // Try some Set Graphics Rendition (SGR) terminal escape sequences
    wprintf(L"hello");
    wprintf(L"\x1b]2;titel\x07");
    return 0;
}

它不会更改控制台窗口标题。

zzwlnbp8

zzwlnbp81#

Microsoft文档建议:
请注意,这些序列是OSC“操作系统命令”序列,而不是与所列出的许多其他序列一样的CSI,因此以“\x1b]"而不是“\x1b["开始。作为OSC序列,它们以表示为ESC\(0x 1B 0x 5C)的字符串终止符结束,并以ESC \(0x 1B 0x 5C)传输。BEL(0x 7)可用作终止符,但首选较长的形式。
这不是MS第一次没有实现一些东西。试试Esc \ -它对我很有效。
也就是说,我在调试过程中注意到窗口标题不会立即更改,并且由于您在序列之后立即终止程序,因此可能看不到效果。

相关问题