如何检测当前是否在控制台中启用了Windows 10缓冲区包装模式

有没有什么办法可以检测一个控制台程序是否在Windows 10的新function启用的情况下运行?

此MSDN页面显示HKEY_CURRENT_USER\Console\ForceV2HKEY_CURRENT_USER\Console\LineWrapHKEY_CURRENT_USER\Console\{name}\LineWrap控制它,但除此之外,parsing不够健壮,它可能不正确。 如果用户切换到传统模式或从传统模式切换,则更改将在控制台重新启动之后才会生效。

如果我开发应用程序,我可以在启动时进行检查。 可能有一个竞争条件,虽然这使得registry检查没有任何实际用途。 我很好奇第三方控制台窗口的解决scheme。

Solutions Collecting From Web of "如何检测当前是否在控制台中启用了Windows 10缓冲区包装模式"

似乎没有API,虽然我希望有一个后来的SDK(也许在GetConsoleMode额外的超级扩展标志)。

同时,下面是一个快速入侵,它试图通过检查GetMinMaxInfo返回的ptMaxTrackSize.X值来检测新控制台的调整大小的能力。

传统的控制台不允许调整窗口的大小,而不是屏幕缓冲区的宽度,而新的窗口就是这样。 假设(a)控制台以全缓冲区宽度运行,即没有水平滚动条,并且(b)它还没有被拉伸到全屏幕/最大屏幕宽度,则检查窗口是否允许自己调整大小是相当简单的(新的控制台)或不(旧的控制台)。 应该注意的是假设(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