Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как запустить консольное приложение Delphi из Проводника Windows 11 в отдельном окне, чтобы избежать проблем с интерфейсом?

Delphi , Синтаксис , Память и Указатели

 

Проблема с консольными приложениями в Windows 11

В Windows 11 Microsoft изменила поведение консольных приложений - теперь по умолчанию они запускаются в новом Windows Terminal с вкладками, что может вызывать проблемы с отображением интерфейса. В отличие от Windows 10, где консольные приложения открывались в классическом окне cmd.exe, в Windows 11 разработчики столкнулись с тем, что:

  1. Размер окна не соответствует ожидаемому
  2. Интерфейс может обрезаться
  3. Ручное изменение размера окна не всегда помогает

Решения для разработчиков Delphi/Pascal

Рассмотрим несколько подходов к решению этой проблемы для приложений, написанных на Object Pascal.

1. Использование batch-файла с определением версии Windows

Один из предложенных вариантов - создание batch-файла, который определяет версию Windows и соответствующим образом запускает приложение:

// Пример кода для создания batch-файла из программы Delphi
procedure CreateBatchFile;
var
  BatchFile: TextFile;
begin
  AssignFile(BatchFile, 'launcher.bat');
  Rewrite(BatchFile);
  Writeln(BatchFile, '@ECHO OFF');
  Writeln(BatchFile, 'CLS');
  Writeln(BatchFile, 'SETLOCAL');
  Writeln(BatchFile, 'SET App=MyApp.exe');
  Writeln(BatchFile, 'SET CMD_Windows11=%USERPROFILE%\AppData\Local\Microsoft\WindowsApps\wt.exe');
  Writeln(BatchFile, 'SET CMD_window=%WINDIR%\System32\cmd.exe');
  Writeln(BatchFile, 'IF EXIST %App% (');
  Writeln(BatchFile, '  ver | find "11." > nul');
  Writeln(BatchFile, '  IF %ERRORLEVEL% EQU 0 (');
  Writeln(BatchFile, '    IF EXIST %CMD_Windows11% (');
  Writeln(BatchFile, '      call %CMD_Windows11% --size 83,45 --title MyApp --suppressApplicationTitle -d . %CMD_window% /k %App%');
  Writeln(BatchFile, '    ) ELSE (');
  Writeln(BatchFile, '      call %CMD_window% /k %App%');
  Writeln(BatchFile, '    )');
  Writeln(BatchFile, '  ) ELSE (');
  Writeln(BatchFile, '    call %CMD_window% /k %App%');
  Writeln(BatchFile, '  )');
  Writeln(BatchFile, ') ELSE (');
  Writeln(BatchFile, '  ECHO Can''t find %App%');
  Writeln(BatchFile, '  PAUSE');
  Writeln(BatchFile, ')');
  Writeln(BatchFile, 'ENDLOCAL');
  CloseFile(BatchFile);
end;

2. Создание собственного консольного окна

Альтернативный подход - использовать 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;

Рекомендации для разработчиков

  1. Учитывайте оба сценария - разрабатывайте приложение так, чтобы оно могло работать как в Windows Terminal, так и в классической консоли.

  2. Проверяйте размеры консоли при запуске:

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;
  1. Предоставляйте пользователям инструкции по настройке окружения, если это необходимо.

  2. Рассмотрите вариант GUI-приложения, если требования к интерфейсу строгие.

Заключение

Хотя Windows 11 изменила поведение консольных приложений по умолчанию, разработчики Delphi могут использовать несколько подходов для обеспечения корректного отображения своих программ. Наиболее универсальным решением является создание batch-файла с определением версии Windows или использование WinAPI для управления консольным окном непосредственно из программы.

Для сложных интерфейсов стоит рассмотреть вариант перехода на GUI-приложение, что даст полный контроль над отображением и поведением окна.

Создано по материалам из источника по ссылке.

Рассказываем Как запустить консольное приложение Delphi из Проводника Windows 11 в отдельном окне


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-13 21:45:17/0.0065410137176514/0