在 Windows 上设置控制台窗口大小

新手上路,请多包涵

我知道关于如何设置控制台大小有很多问题。但是所有找到的解决方案对我来说都是一样的,而且我的代码对我不起作用。

好的,所以要设置控制台窗口大小,我需要两个函数。它们是 SetConsoleScreenBufferSize()SetConsoleWindowInfo() 。我的功能的第一个版本:

 bool SetWindowSize(size_t width, size_t height)
{
    HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
    if(output_handle == INVALID_HANDLE_VALUE)
        return false;

    COORD coord = {};
    coord.X = static_cast<SHORT>(width);
    coord.Y = static_cast<SHORT>(height);
    if(::SetConsoleScreenBufferSize(output_handle, coord) == FALSE)
        return false;

    SMALL_RECT rect = {};
    rect.Bottom = coord.X - 1;
    rect.Right = coord.Y - 1;
    return (::SetConsoleWindowInfo(output_handle, TRUE, &rect) != FALSE);
}

SetConsoleScreenBufferSize() 不适用于所有值。从文档:

指定的宽高不能小于控制台屏幕缓冲区窗口的宽高

让我们尝试获取当前窗口的大小并调用我们的函数。要获取窗口大小,我需要 GetConsoleScreenBufferInfo() 函数。 main() 测试代码:

 HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
if(output_handle == INVALID_HANDLE_VALUE)
    return 0;
CONSOLE_SCREEN_BUFFER_INFO info = {};
if(::GetConsoleScreenBufferInfo(output_handle, &info) == FALSE)
    return 0;
size_t width = info.srWindow.Right - info.srWindow.Left;
size_t height = info.srWindow.Bottom - info.srWindow.Top;
bool suc = SetWindowSize(width + 1, height + 1);

在这种情况下 SetConsoleScreenBufferSize() 工作正常。下一个函数是 SetConsoleWindowInfo() 。此功能将在以下情况下起作用:

如果指定的窗口矩形超出控制台屏幕缓冲区的边界,则该函数将失败。 This means that the Top and Left members of the lpConsoleWindow rectangle (or the calculated top and left coordinates, if bAbsolute is FALSE)不能小于零。同理, BottomRight 成员(或计算的底部和右侧坐标)不能大于(屏幕缓冲区 height – 1 )和(屏幕缓冲区 width – 1 ),分别。如果 Right 成员(或计算的右坐标)小于或等于 Left 成员(或计算的左坐标)或 Bottom 成员(或计算的底部坐标)小于或等于 Top 成员(或计算的顶部坐标)。

In our case, the values of rectangle are the same (because Left and Top are zeroes) as values of info.srWindow rectangle after call of GetConsoleScreenBufferInfo() .但! SetConsoleWindowInfo() 下一个失败 ::GetLastError()

 @err,hr ERROR_INVALID_PARAMETER : The parameter is incorrect.   unsigned int

如果我交换这两个函数的调用:

 bool SetWindowSize(size_t width, size_t height)
{
    HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
    if(output_handle == INVALID_HANDLE_VALUE)
        return false;

    SMALL_RECT rect = {};
    rect.Bottom = static_cast<SHORT>(width);
    rect.Right = static_cast<SHORT>(height);
    if(::SetConsoleWindowInfo(output_handle, TRUE, &rect) == FALSE)
        return false;

    COORD coord = {};
    coord.X = rect.Bottom + 1;
    coord.Y = rect.Right + 1;

    return (::SetConsoleScreenBufferSize(output_handle, coord) != FALSE);
}

那么我会有同样的错误。

那么,如何正确使用 SetConsoleScreenBufferSize()SetConsoleWindowInfo()

原文由 grisha 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
1 个回答

SetConsoleWindowInfo() 不会在屏幕上重新定位控制台窗口。此函数的名称具有误导性。它宁可 滚动 控制台窗口内的当前可见部分。在此处查看 此示例

如果要设置运行程序的控制台窗口的位置,请使用以下代码:

 HWND hwnd = GetConsoleWindow();
RECT rect = {100, 100, 300, 500};
MoveWindow(hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,TRUE);

原文由 RED SOFT ADAIR 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题