调整Windows控制台API报告窗口的大小

时间:2019-04-02 00:55:07

标签: c windows console

在Windows控制台API中,您可以为BUFFER调整大小时(通过窗口调整大小)收集输入,但是无法为WINDOW调整大小时收集输入。为了说明这个问题,这是一个小程序:

#include <Windows.h>
#include <stdio.h>

#define STR_BUF_SIZE 128
#define ENABLE_WINDOW_INPUT

int main() {
    HANDLE screenBufferHandle = CreateConsoleScreenBuffer(
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        CONSOLE_TEXTMODE_BUFFER,
        NULL
    );
    SetConsoleActiveScreenBuffer(screenBufferHandle);
    HANDLE in = GetStdHandle(STD_INPUT_HANDLE);

    CONSOLE_SCREEN_BUFFER_INFO info;
    INPUT_RECORD recordBuffer[32];

    char strBuf[STR_BUF_SIZE];

    while (1) {

        // Collect the input
        int inputLeft, inputToProcess;
        do {
            GetNumberOfConsoleInputEvents(in, &inputLeft);
            if (!inputLeft) {
                break;
            }
            inputLeft -= 32;
            ReadConsoleInput(
                in,
                recordBuffer,
                32,
                &inputToProcess
            );
            int i = 0;
            while (i < inputToProcess) {
                if (recordBuffer[i].EventType == WINDOW_BUFFER_SIZE_EVENT) {
                    COORD size = recordBuffer[i].Event.WindowBufferSizeEvent.dwSize;
                    sprintf_s(strBuf, STR_BUF_SIZE, "Event recorded, %dx%d\n", size.X, size.Y);
                    OutputDebugString(strBuf);
                }
                i++;
            }
        } while (inputLeft > 0);

        GetConsoleScreenBufferInfo(screenBufferHandle, &info);
    }

}

这将在调整缓冲区大小时报告(调试)。这是一个问题所在:如果,缓冲区大小未调整:

  • 缓冲区已经比窗口高(出现垂直滚动条) AND

  • 调整大小事件仅影响Y轴

在这种情况下,缓冲区不会调整大小,窗口会缩小,滚动条上的句柄也会调整大小。但是,我希望Windows 因为报告此事件:

我想保持缓冲区与窗口的大小完全相同,以隐藏滚动条。

0 个答案:

没有答案