Установить размер окна консоли в Windows
Я знаю, что есть много вопросов о том, как установить размер консоли. Но все найденные решения одинаковы для меня, и мой код не работает для меня.
Итак, для установки размера окна консоли мне нужны две функции. Они есть SetConsoleScreenBufferSize () а также SetConsoleWindowInfo () . Первая версия моей функции:
SetConsoleScreenBufferSize() будет работать не для всех значений. Из документации:
Указанные ширина и высота не могут быть меньше ширины и
высота окна буфера экрана консоли
Попробуем получить размер текущего окна и вызвать нашу функцию. Чтобы получить размер окна, мне нужно GetConsoleScreenBufferInfo () функция. Тестовый код main ():
В этом случае SetConsoleScreenBufferSize() работает отлично. Следующая функция SetConsoleWindowInfo() , Эта функция будет работать в случае:
Функция завершается ошибкой, если указанный прямоугольник окна выходит за пределы
Границы буфера экрана консоли. Это означает, что Top
а также Left члены lpConsoleWindow прямоугольник (или рассчитанный
координаты сверху и слева, если bAbsolute ЛОЖЬ) не может быть меньше
нуль. Точно так же Bottom а также Right члены (или рассчитанные
нижняя и правая координаты) не может быть больше (экранный буфер
height – 1 ) и (экранный буфер width – 1 ) соответственно. Функция
также не удается, если Right член (или вычисленная правая координата)
меньше или равно Left член (или вычисленная левая координата)
или если Bottom член (или рассчитанная нижняя координата) меньше чем
или равно Top член (или вычисленная верхняя координата).
В нашем случае значения прямоугольника совпадают (потому что Left а также Top являются нулями) в качестве значений info.srWindow прямоугольник после вызова GetConsoleScreenBufferInfo() , Но! SetConsoleWindowInfo() терпит неудачу со следующим ::GetLastError()
Если я поменяю местами вызовы этих двух функций:
тогда у меня будет такая же ошибка.
Итак, как я могу использовать SetConsoleScreenBufferSize() а также SetConsoleWindowInfo() правильно?
Решение
SetConsoleWindowInfo () не перемещает окно консоли на экране. Название этой функции вводит в заблуждение. Это скорее свитки текущая видимая часть в окне консоли. Увидеть этот образец Вот.
Если вы хотите установить положение консольного окна, в котором выполняется ваша программа, используйте такой код:
Размер окна и буфера экрана Window and Screen Buffer Size
Размер буфера экрана выражается в виде координатной сетки, основанной на ячейках символов. The size of a screen buffer is expressed in terms of a coordinate grid based on character cells. Ширина — это число ячеек символов в каждой строке, а высота — число строк. The width is the number of character cells in each row, and the height is the number of rows. Связанный с каждым буфером экрана — это окно, определяющее размер и расположение прямоугольной части буфера экрана консоли, отображаемой в окне консоли. Associated with each screen buffer is a window that determines the size and location of the rectangular portion of the console screen buffer displayed in the console window. Окно буфера экрана определяется с помощью указания координат символьной ячейки в верхней левой и нижней правой ячейках прямоугольника окна. A screen buffer’s window is defined by specifying the character-cell coordinates of the upper left and lower right cells of the window’s rectangle.
В мире виртуальных последовательностей терминалов размер окна и размер буфера экрана фиксируются для одного и того же значения. In the virtual terminal sequences world, the size of the window and the size of the screen buffer are fixed to the same value. Терминал обрабатывает любой регион скроллбакк, который будет эквивалентом консоли с размером буфера экрана, превышающим размер окна. The terminal handles any scrollback region that would be the equivalent of a console with a screen buffer size larger than its window size. Это содержимое принадлежит терминалу и, как правило, больше не является частью области с адресацией. That content belongs to the terminal and is generally no longer a part of the addressable area. Дополнительные сведения см. в статье сравнение классических функций консоли и виртуальных последовательностей терминалов . For more information, please see our comparison of the classic console functions versus virtual terminal sequences .
Буфер экрана может иметь любой размер, ограниченный только объемом доступной памяти. A screen buffer can be any size, limited only by available memory. Размеры окна буфера экрана не могут превышать соответствующие размеры буфера экрана консоли или максимального окна, которое может уместиться на экране на основе текущего размера шрифта (управляется исключительно пользователем). The dimensions of a screen buffer’s window cannot exceed the corresponding dimensions of either the console screen buffer or the maximum window that can fit on the screen based on the current font size (controlled exclusively by the user).
Функция жетконсолескринбуфферинфо возвращает следующие сведения о буфере экрана и его окне: The GetConsoleScreenBufferInfo function returns the following information about a screen buffer and its window:
- Текущий размер буфера экрана консоли The current size of the console screen buffer
- Текущее расположение окна The current location of the window
- Максимальный размер окна, учитывая текущий размер буфера экрана, текущий размер шрифта и размер экрана The maximum size of the window given the current screen buffer size, the current font size, and the screen size
Функция жетларжестконсолевиндовсизе Возвращает максимальный размер окна консоли на основе текущего шрифта и размеров экрана. The GetLargestConsoleWindowSize function returns the maximum size of a console’s window based on the current font and screen sizes. Этот размер отличается от максимального размера окна, возвращенного жетконсолескринбуфферинфо в том случае, если размер буфера экрана консоли не учитывается. This size differs from the maximum window size returned by GetConsoleScreenBufferInfo in that the console screen buffer size is ignored.
Чтобы изменить размер буфера экрана, используйте функцию сетконсолескринбуфферсизе . To change a screen buffer’s size, use the SetConsoleScreenBufferSize function. Эта функция завершается ошибкой, если любое измерение указанного размера меньше, чем соответствующее измерение окна консоли. This function fails if either dimension of the specified size is less than the corresponding dimension of the console’s window.
Чтобы изменить размер или расположение окна буфера экрана, используйте функцию сетконсолевиндовинфо . To change the size or location of a screen buffer’s window, use the SetConsoleWindowInfo function. Эта функция завершается ошибкой, если указанные координаты углового окна превышают пределы буфера экрана консоли или экрана. This function fails if the specified window-corner coordinates exceed the limits of the console screen buffer or the screen. Изменение размера окна активного буфера экрана изменяет размер окна консоли, отображаемого на экране. Changing the window size of the active screen buffer changes the size of the console window displayed on the screen.
Процесс может изменить входной режим консоли, чтобы разрешить входные данные окна, чтобы процесс мог получать входные данные, когда пользователь изменяет размер буфера экрана консоли. A process can change its console’s input mode to enable window input so that the process is able to receive input when the user changes the console screen buffer size. Если приложение включает входные данные окна, оно может использовать жетконсолескринбуфферинфо для извлечения размера окна и буфера экрана при запуске. If an application enables window input, it can use GetConsoleScreenBufferInfo to retrieve window and screen buffer size at startup. Эти сведения можно затем использовать для определения способа отображения данных в окне. This information can then be used to determine the way data is displayed in the window. Если пользователь изменяет размер буфера экрана консоли, приложение может ответить, изменив способ отображения данных. If the user changes the console screen buffer size, the application can respond by changing the way data is displayed. Например, приложение может настроить способ переноса текста в конце строки при каждом изменении количества символов в строке. For example, an application can adjust the way text wraps at the end of the line if the number of characters per row changes. Если приложение не включает входные данные окна, оно должно либо использовать унаследованные размеры окон и буферов экрана, либо задать требуемый размер во время запуска и восстановить унаследованные размеры при выходе. If an application does not enable window input, it must either use the inherited window and screen buffer sizes, or set them to the desired size during startup and restore the inherited sizes at exit. Дополнительные сведения о режиме ввода окна см. в разделе режимы консоли низкого уровня. For additional information about window input mode, see Low-Level Console Modes.
Console. Set Window Size(Int32, Int32) Метод
Определение
Устанавливает заданные значения высоты и ширины окна консоли. Sets the height and width of the console window to the specified values.
Параметры
Ширина окна консоли измеряется столбцами. The width of the console window measured in columns.
Высота окна консоли измеряется строками. The height of the console window measured in rows.
Исключения
width или height меньше или равно нулю. width or height is less than or equal to zero.
Сумма width и WindowLeft либо сумма height и WindowTop больше или равна MaxValue. width plus WindowLeft or height plus WindowTop is greater than or equal to MaxValue.
Значение параметра width или height больше ширины или высоты окна максимально возможной при текущем разрешении и шрифте консоли. width or height is greater than the largest possible window width or height for the current screen resolution and console font.
Пользователь не имеет разрешений на выполнение этого действия. The user does not have permission to perform this action.
Ошибка ввода/вывода. An I/O error occurred.
Текущая операционная система не является системой Windows. The current operating system is not Windows.
Примеры
В этом примере демонстрируется SetWindowSize метод, а WindowWidth также WindowHeight Свойства и. This example demonstrates the SetWindowSize method, and the WindowWidth and WindowHeight properties. Чтобы увидеть полный результат изменения размера окна консоли, необходимо выполнить пример. You must run the example to see the full effect of changing the console window size.
Пример сообщает размерам окна консоли, для которых задано значение 85 столбцов и 43 строк, а затем ожидает нажатия клавиши. The example reports the dimensions of a console window set to 85 columns and 43 rows, then waits for a key to be pressed. При нажатии любой клавиши размеры окна консоли увеличиваются вдвое, выводятся новые измерения, а в примере ожидается еще один нажатие клавиши. When any key is pressed, the dimensions of the console window are halved, the new dimensions are reported, and the example waits for another key press. Наконец, при нажатии любой клавиши окно консоли восстанавливается до исходных измерений, а пример завершается. Finally, when any key is pressed, the console window is restored to its original dimensions and the example terminates.
Как открыть консольное приложение с заданным размером окна?
Приложение, которое я хочу запустить, — MongoDB. Если бы я начал это нормально, это выглядит так:
Мне не нравится количество разрывов строк, и у меня много места на экране, поэтому я хотел бы использовать это пространство, чтобы избавиться от разрывов строк.
Я могу изменить размер окна консоли MODE , поэтому я написал командный файл следующим образом:
Все идет нормально. Когда я запускаю этот пакетный файл, я получаю большее окно, по желанию.
Но когда я теперь нажимаю Ctrl + C для выхода из MongoDB, я получаю раздражающее приглашение:
Что бесполезно, потому что команда, из которой я только что вышел, была последней командой в пакетном задании в любом случае, и независимо от того, что я отвечаю, результат один и тот же.
Итак, как я могу получить большее окно консоли для приложения, не имея этого запроса, когда я нажимаю Ctrl + C ?
Сегодня я потратил несколько часов на реализацию небольшого приложения на C #, которое может обернуть другое консольное приложение и настроить размер окна хоста консоли.
console-wrapper прост в использовании. Он ожидает только пару параметров командной строки:
—width и —height используются для установки размера результирующего окна консоли. —subject может использоваться опционально, если он опущен, остальные параметры обрабатываются как команда (с параметрами) для запуска.
Итак, последний вызов, который я сейчас использую в нашем скрипте запуска:
START «MongoDB» database\console-wrapper.exe —width=140 —height=70 %
Результирующее окно будет иметь запрошенный размер, и после нажатия Ctrl + C окно закроется (после правильного завершения процесса).
Рассматривали ли вы запускать его из сценария PowerShell? Powershell способен изменять размеры своего окна
Это создает окно размером 150, но также имеет боковой прокручиваемый буфер 300.
Насколько я понимаю вопрос, вы хотите, чтобы MongoDB имел заданный размер окна консоли и выходил при нажатии Ctrl + C . Тогда ответ довольно прост: используйте ярлык, чтобы запустить его.
У меня нет mongod исполняемого файла, поэтому я хотел бы использовать perl.exe в качестве примера. Когда вы запускаете его из диалогового окна « Выполнить » ( Windows + R ), размер окна консоли будет стандартным 80 × 25 с размером буфера на 300 строк.
- Создайте ярлык для mongod (или perl в моем случае).
- Щелкните правой кнопкой мыши ярлык и выберите Свойства .
- На вкладке « Ярлык » в поле « Цель» добавьте параметры mongod .
- Start in field управляет начальным текущим каталогом запущенной программы. По умолчанию это каталог, в котором находится .exe.
- Нажмите вкладку Layout .
- Измените размер окна на 140 × 70.
- Вы можете увеличить Высоту от экрана размера буфера 1000 или больше , чтобы иметь возможность прокручивать до старых сообщений.
- Если вы очистите окно «Положение системы» , вы можете указать расположение окна консоли на экране.
- Измените размер окна на 140 × 70.
- Нажмите OK, чтобы закрыть свойства ярлыка.
Теперь, когда вы нажмете этот ярлык, окно консоли будет иметь указанный размер. Когда вы нажимаете Ctrl + C , приложение закрывается, и окно закрывается без каких-либо дополнительных запросов.
Вы также можете изменить макет окна после его запуска из диалогового окна « Выполнить ». Щелкните правой кнопкой мыши заголовок окна консоли и выберите « Свойства» . Перейдите на вкладку « Макет », настройте размер окна и нажмите « ОК», чтобы закрыть свойства и немедленно применить изменения. (Если окно было запущено из ярлыка, свойства ярлыка обновляются.)
В следующий раз, когда вы запустите то же приложение, размер окна консоли будет волшебным образом того же размера. (На этот раз я не проверял, но это работало.)