C 更改Windows控制台大小

C 更改Windows控制台大小,c,windows-console,C,Windows Console,我一直在想如何调整控制台窗口的大小。 下面是我正在使用的函数的代码: #include <windows.h> #include <stdio.h> #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd; void setup() { SMALL_RECT windowSize = {0, 0, WIDTH - 1, HEIGHT - 1}; COORD bufferSize = { WIDTH , HEI

我一直在想如何调整控制台窗口的大小。 下面是我正在使用的函数的代码:

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

#define WIDTH 70
#define HEIGHT 35

HANDLE wHnd; 

void setup() {
    SMALL_RECT windowSize = {0, 0, WIDTH - 1, HEIGHT - 1};
    COORD bufferSize = { WIDTH , HEIGHT };
    wHnd = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTitle("Conway's Game of Life");
    SetConsoleWindowInfo(wHnd, 1, &windowSize); 
    SetConsoleScreenBufferSize(wHnd, bufferSize);
}
在此之前,这个代码段工作没有问题,但现在它没有,甚至在其他PC上也没有。它在旧项目上停止工作太奇怪了

你知道我怎么能全屏播放吗?(ALT+ENTER works)或在启动时使控制台窗口变大?我看过ncurses,但我使用的是windows10,不知道如何使用它,而且我的教授可能不希望我使用外部库。
谢谢你的帮助!如果我忘了什么,请告诉我。

要最大化控制台窗口,您可以执行以下操作:

C++

#包括
#包括
#包括
#包括
#包括
#包括
std::string get_last_error_msg()
{
自动错误代码{GetLastError()};
如果(!错误代码)
返回{};
LPSTR缓冲区{};
自动调整大小{FormatMessageA(格式{U消息}分配{U缓冲区}格式{U消息}来自{U系统}格式{U消息}忽略},
nullptr,error\u code,MAKELANGID(LANG\u NEUTRAL,SUBLANG\u DEFAULT),reinterpret\u cast(&buffer),0,nullptr)};
//使用唯一的\u ptr作为缓冲区,因为字符串的ctor可能引发
std::unique_ptr p{buffer,LocalFree};
字符串消息{p.get(),size};
返回消息;
}
bool_控制台()
{
自动控制台窗口{GetConsoleWindow()};
如果(!控制台窗口){

微软在某个时候放弃了对控制台应用程序的全屏支持,转而在XP和Vista之间开发一种新的图形驱动程序(我太懒了,也不想去查它)。如果你想调整控制台窗口的大小,你必须确保控制台输出屏幕缓冲区的大小至少与你想调整窗口大小的大小相同。是的,我也读到过,奇怪的是,它一周前工作,但现在没有(全屏)我的控制台输出屏幕缓冲区比我希望窗口大小要大,但是它只适用于小尺寸但不适合大尺寸的!非常感谢!我必须使用C而不是C++。我只是注意到StAdvOpver从标题中删除了“C”。(至少C标签还在那里,尽管它是有用的,因为C++是我想学的,但是在UNI中没有,但是我可以使用一些或大部分,但是看起来还太近了。非常感谢!^这太晚了:当函数返回值指示调用将返回有用数据时,您应该立即调用GETLASTROM函数。“不要假设,C++ I/O流库对于调用线程的最后一个错误代码不会有任何明显的副作用。最简单的(安全的)解决方案:将错误代码传递到
get\u last\u error\u msg
(并重命名函数)。
SetConsoleDisplayMode(wHnd, CONSOLE_FULLSCREEN_MODE, 0);
#include <cstdlib>
#include <string>
#include <iostream>
#include <memory>
#include <type_traits>

#include <windows.h>

std::string get_last_error_msg()
{
    auto error_code{ GetLastError() };
    if (!error_code)
        return {};

    LPSTR buffer{};
    auto size{ FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        nullptr, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPSTR>(&buffer), 0, nullptr) };

    // use a unique_ptr for buffer since the ctor of string could throw
    std::unique_ptr<std::remove_pointer_t<decltype(buffer)>, decltype(&LocalFree)> p{ buffer, LocalFree };
    std::string message{ p.get(), size };
    return message;
}

bool maximize_console()
{
    auto console_window{ GetConsoleWindow() };

    if (!console_window) {
        std::cerr << "GetConsoleWindow() failed :(\n\n";
        return false;
    }

    auto console_out{ GetStdHandle(STD_OUTPUT_HANDLE) };
    if (console_out == INVALID_HANDLE_VALUE) {
        std::cerr << "GetStdHandle() failed with \"" << get_last_error_msg() << "\" :(\n\n";
        return false;
    }

    auto largest_size{ GetLargestConsoleWindowSize(console_out) };
    if (!largest_size.X && !largest_size.Y) {
        std::cerr << "GetLargestConsoleWindowSize() failed with \"" << get_last_error_msg() << "\" :(\n\n";
        return false;
    }

    --largest_size.X;
    --largest_size.Y;

    if (!SetConsoleScreenBufferSize(console_out, largest_size)) {
        std::cerr << "SetConsoleScreenBufferSize() failed with \"" << get_last_error_msg() << "\" :(\n\n";
        return false;
    }

    if (!ShowWindow(console_window, SW_MAXIMIZE)) {
        std::cerr << "ShowWindow() failed :(\n\n";
        return false;
    }

    return true;
}

int main()
{
    if (!maximize_console())
        return EXIT_FAILURE;
}
#include <stdbool.h>
#include <stdio.h>

#include <windows.h>

LPSTR get_last_error_msg(void)
{
    DWORD error_code = GetLastError();
    if (!error_code)
        return LocalAlloc(LMEM_ZEROINIT, 1);

    LPSTR buffer = NULL;
    FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, NULL);

    return buffer;
}

bool maximize_console(void)
{
    HWND console_window = GetConsoleWindow();

    if (!console_window) {
        fputs("GetConsoleWindow() failed :(\n", stderr);
        return false;
    }

    HANDLE console_out = GetStdHandle(STD_OUTPUT_HANDLE);
    if (console_out == INVALID_HANDLE_VALUE) {
        LPSTR buffer = get_last_error_msg();
        fprintf(stderr, "GetStdHandle() failed with \"%s\" :(\n\n", buffer);
        LocalFree(buffer);
        return false;
    }

    COORD largest_size = GetLargestConsoleWindowSize(console_out);
    if (!largest_size.X && !largest_size.Y) {
        LPSTR buffer = get_last_error_msg();
        fprintf(stderr, "GetLargestConsoleWindowSize() failed with \"%s\" :(\n\n", buffer);
        LocalFree(buffer);
        return false;
    }

    --largest_size.X;
    --largest_size.Y;

    if (!SetConsoleScreenBufferSize(console_out, largest_size)) {
        LPSTR buffer = get_last_error_msg();
        fprintf(stderr, "SetConsoleScreenBufferSize() failed with \"%s\" :(\n\n", buffer);
        LocalFree(buffer);
    }

    if (!ShowWindow(console_window, SW_MAXIMIZE)) {
        fputs("ShowWindow() failed :(\n", stderr);
        return false;
    }

    return true;
}

int main(void)
{
    if (!maximize_console())
        return EXIT_FAILURE;
}