gpt4 book ai didi

更改 Windows 控制台大小

转载 作者:行者123 更新时间:2023-12-05 01:37:40 27 4
gpt4 key购买 nike

我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码:

#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);
}

虽然它适用于较小的宽度和高度(例如 70 和 35)。它不适合我需要的大小(几乎是两倍大,是的,我相应地调整了缓冲区大小,总是比 windowSize 大一点)。然后它就是常规尺寸。我的下一个想法是,既然它已经很大了,为什么不全屏呢。

SetConsoleDisplayMode(wHnd, CONSOLE_FULLSCREEN_MODE, 0);

在此代码片段之前没有问题,但现在没有,甚至在其他 PC 上也没有。它停止处理旧项目太奇怪了。

知道如何以全屏模式启动它吗? (ALT + ENTER 有效)或者在启动时使控制台窗口变大?我看过 ncurses,但我在 Windows 10 上,不知道如何使用它,此外我的教授可能不希望我使用外部库。谢谢你的帮助!如果我忘记了什么,请告诉我。

最佳答案

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

C++

#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;
}

C

#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;
}

关于更改 Windows 控制台大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53221855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com