如何检测控制台当前是否启用Windows10缓冲区环绕模式

How to detect whether Windows 10 buffer wrapping mode is currently enabled in the console

有什么方法可以检测控制台应用程序是否 运行 Windows 10 的新功能已启用?

This MSDN page 显示 HKEY_CURRENT_USER\Console\ForceV2HKEY_CURRENT_USER\Console\LineWrapHKEY_CURRENT_USER\Console\{name}\LineWrap 控制它,但除了解析不那么健壮之外,它可能不正确。如果用户切换到旧模式或从旧模式切换,更改将在控制台重新启动后才会生效。

如果我开发应用程序,我可以在启动时进行检查。但是可能存在竞争条件,这使得注册表检查对于任何实际使用都毫无用处。我很好奇第三方控制台 windows.

的解决方案是什么

似乎没有 API,尽管我希望在以后的 SDK 中出现一个(可能是 GetConsoleMode 中的额外超扩展标志)。

同时,下面是一个快速破解,它基于检查 GetMinMaxInfo 返回的 ptMaxTrackSize.X 值,尝试检测新控制台的调整大小更宽的能力。

旧控制台不允许将 window 调整为比屏幕缓冲区宽度更宽,而新控制台可以。假设 (a) 控制台 运行 处于全缓冲区宽度,即没有水平滚动条,并且 (b) 它尚未拉伸到 full/max 屏幕宽度,检查是否相当简单window 允许调整自身的大小(新控制台)或不调整(旧控制台)。应该注意的是,假设 (a) 在技术上可以通过手动将缓冲区宽度从字符转换为像素来避免,而不是依赖 GetWindowRect,但假设 (b) 几乎是不可避免的。

这是代码(免责声明:概念的快速验证,没有错误检查等)。

int main()
{
    // largest possible console size for given font and desktop
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD cd = GetLargestConsoleWindowSize(hOut);
    SHORT nScrMaxXch = cd.X, 
        nScrMaxYch = cd.Y;

    // current and max console sizes for given screen buffer
    CONSOLE_SCREEN_BUFFER_INFOEX csbix = { sizeof(csbix) };
    GetConsoleScreenBufferInfoEx(hOut, &csbix);
    SHORT nWndXch = csbix.srWindow.Right - csbix.srWindow.Left + 1,
        nWndYch = csbix.srWindow.Bottom - csbix.srWindow.Top + 1;
    SHORT nWndMaxXch = csbix.dwMaximumWindowSize.X,
        nWndMaxYch = csbix.dwMaximumWindowSize.Y;

    wprintf(L"chars:   wnd-size %d %d, max-wnd-size %d %d, largest-size %d %d\n",
        nWndXch, nWndYch, nWndMaxXch, nWndMaxYch, nScrMaxXch, nScrMaxYch);

    // current window size
    HWND hWnd = GetConsoleWindow();
    RECT rc; GetWindowRect(hWnd, &rc);
    LONG nWndXpx = rc.right - rc.left,
        nWndYpx = rc.bottom - rc.top;

    // max window tracking size
    MINMAXINFO mmi = { 0 };
    SendMessage(hWnd, WM_GETMINMAXINFO, 0, (LPARAM)&mmi);
    LONG nWndMaxXpx = mmi.ptMaxTrackSize.x,
        nWndMaxYpx = mmi.ptMaxTrackSize.y;

    wprintf(L"pixels:  wnd-size %lu %lu, max-tracking-size %lu %lu\n",
        nWndXpx, nWndYpx, nWndMaxXpx, nWndMaxYpx);

    if (nWndXch == nWndMaxXch   // full buffer width, no h-scrollbar 
    && nWndXch < nScrMaxXch     // not already stretched to full screen width
    && nWndMaxXpx > nWndXpx)    // allowed to resized wider
        wprintf(L"\n...most likely a Win10 console with ForceV2 enabled\n");

    return 0;
}

这是在旧控制台中 运行 时的输出。

chars:   wnd-size 80 25, max-wnd-size 80 71, largest-size 240 71
pixels:  wnd-size 677 443, max-tracking-size 677 1179

这是新控制台运行时的输出。

chars:   wnd-size 80 25, max-wnd-size 80 71, largest-size 239 71
pixels:  wnd-size 677 443, max-tracking-size 1936 1186

...most likely a Win10 console with ForceV2 enabled