В Windows 11 Microsoft изменила поведение консольных приложений - теперь по умолчанию они запускаются в новом Windows Terminal с вкладками, что может вызывать проблемы с отображением интерфейса. В отличие от Windows 10, где консольные приложения открывались в классическом окне cmd.exe, в Windows 11 разработчики столкнулись с тем, что:
Размер окна не соответствует ожидаемому
Интерфейс может обрезаться
Ручное изменение размера окна не всегда помогает
Решения для разработчиков Delphi/Pascal
Рассмотрим несколько подходов к решению этой проблемы для приложений, написанных на Object Pascal.
1. Использование batch-файла с определением версии Windows
Один из предложенных вариантов - создание batch-файла, который определяет версию Windows и соответствующим образом запускает приложение:
Альтернативный подход - использовать WinAPI для создания собственного консольного окна:
program CustomConsoleApp;
uses
Windows, SysUtils;
var
hConsole: HWND;
hMenu: HMENU;
ConsoleTitle: string;
begin
// Создаем новую консоль
AllocConsole;
// Получаем handle консольного окна
hConsole := GetConsoleWindow;
if hConsole <> 0 then
begin
// Устанавливаем заголовок окна
ConsoleTitle := 'Мое консольное приложение';
SetConsoleTitle(PChar(ConsoleTitle));
// Опционально: удаляем некоторые пункты меню
hMenu := GetSystemMenu(hConsole, False);
if hMenu <> 0 then
begin
// Удаляем пункт "Закрыть" (опционально)
// DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
end;
// Устанавливаем размер буфера и окна
SetConsoleSize(80, 50);
end;
// Основной код приложения
Writeln('Приложение работает в собственном консольном окне');
Writeln('Нажмите Enter для выхода...');
Readln;
// Освобождаем консоль перед выходом
FreeConsole;
end;
procedure SetConsoleSize(Cols, Rows: Integer);
var
Rect: TSmallRect;
Coord: TCoord;
begin
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := Cols - 1;
Rect.Bottom := Rows - 1;
Coord.X := Cols;
Coord.Y := Rows;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord);
SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), True, Rect);
end;
3. Использование параметров реестра
Вы можете изменить поведение по умолчанию через реестр, но это потребует действий от пользователя:
procedure SetConsoleDefaultToCmd;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('Console', True) then
begin
Reg.WriteString('TerminalEnabled', '0');
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
Рекомендации для разработчиков
Учитывайте оба сценария - разрабатывайте приложение так, чтобы оно могло работать как в Windows Terminal, так и в классической консоли.
Проверяйте размеры консоли при запуске:
procedure CheckConsoleSize;
var
ConsoleInfo: TConsoleScreenBufferInfo;
hConsole: THandle;
begin
hConsole := GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, @ConsoleInfo);
if (ConsoleInfo.dwSize.X < 80) or (ConsoleInfo.dwSize.Y < 25) then
begin
// Увеличиваем размер консоли, если он слишком мал
SetConsoleSize(80, 25);
end;
end;
Предоставляйте пользователям инструкции по настройке окружения, если это необходимо.
Рассмотрите вариант GUI-приложения, если требования к интерфейсу строгие.
Заключение
Хотя Windows 11 изменила поведение консольных приложений по умолчанию, разработчики Delphi могут использовать несколько подходов для обеспечения корректного отображения своих программ. Наиболее универсальным решением является создание batch-файла с определением версии Windows или использование WinAPI для управления консольным окном непосредственно из программы.
Для сложных интерфейсов стоит рассмотреть вариант перехода на GUI-приложение, что даст полный контроль над отображением и поведением окна.
Рассказываем Как запустить консольное приложение Delphi из Проводника Windows 11 в отдельном окне
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.