Альтернативный консольный хост для Windows 7/Windows Server 2008

Альтернативный консольный хост для Windows 7/Windows Server 2008

Меня часто раздражает консольное хост-приложение Windows, особенно неуклюжая работа буфера обмена, проблемы с автоматической шириной и т. д. Мне бы хотелось узнать, есть ли способ заменить консольный хост по умолчанию conhost.exeна собственный и где я могу найти больше информации об интерфейсах, которые мне придется реализовать, если я буду писать свой собственный.

Я не просто ищу альтернативную консоль, я уже пользуюсь xtermCygWin. Я ищу информацию о том, какзаменятьХост консольного окна Windows по умолчанию.

решение1

Ниже приведены несколько хороших продуктов-заменителей консоли, которые более удобны в использовании, чем cmd.

Как прокомментировано ниже, начиная с Windows 7, все эти оболочки являются просто интерфейсом для conhost.exe, даже powershell. Подробности читайте здесьЧто такое conhost.exe и почему он работает.

Таким образом, консоли ниже заменяют только визуальный интерфейс по умолчанию для conhost, который отображается cmd, и полезны только при прямом вызове в качестве программ. Их нельзя вызывать косвенно, как при запуске исполняемого файла консоли, такого как diskpart, поскольку это вызовет conhost, а conhost имеет свой собственный интерфейс ввода-вывода и API.

Вот что говорит Microsoft вWindows 7 / Windows Server 2008 R2: Консольный хост:

ConHost представляет собой постоянное изменение способа обработки ввода-вывода консольного приложения. Не существует ключа реестра или параметра групповой политики, которые могли бы заставить Windows вернуться к поведению консоли «устаревшего режима».

Вывод таков: если вы хотите заменить консоль глубже, чем заменить интерфейс cmd, то это невозможно. Microsoft выбрала этот дизайн в качестве меры безопасности и не собирается возвращаться к нему.

Единственный способ, который я могу придумать для изменения поведения conhost, — это установить глобальный системный хук на conhost API. Я вообще не знаю, возможно ли это, и до сих пор никто этого не делал (или если и делал, то не говорит). Я также не верю, что Microsoft позволит вам заменить такой критически важный системный файл, как conhost.exe, взломанной версией.

Если требуется замена cmd, который находится в system32\cmd.exe, нужно стать владельцем файла и переименовать его (cmd1.exe?), переименовать console-replacement exe в cmd.exe и скопировать в system32 вместе со всеми файлами, которые нужны для его работы. Это может вызвать проблемы, если заменяющая консоль не поддерживает все параметры, которые поддерживает cmd.

Другой подход, который работает для .bat файлов, это ассоциировать новую консоль с ними. Для этого нужно отредактировать ключ реестра HKEY_CLASSES_ROOT\batfile\shell\open\command. Смотрите этостатьядля получения более подробной информации.

Вот список консолей:

ColorConsole
FireCMD
PowerCmd
GS.EXE
PyCmd

решение2

Есть такие программы какКонсолькоторые оборачивались вокруг cmd.exe и, вероятно, могли дать вам то, что вы ищете, но я не видел ничего, что полностью заменяло бы консольную систему. AFAIK, большинство подобных проектов просто перенаправляют stdin/stdout/stderr, а затем оборачивали более общий графический интерфейс вокруг cmd.exe, скрывая фактическое окно консоли на заднем плане.

решение3

Microsoft опубликовала исходный код conhost.exe (https://github.com/microsoft/terminal).

Код хоста консоли в этом репозитории является фактическим источником, из которого собран сам conhost.exe в Windows.

Итак, теперь у вас есть возможность заменить conhost.exe по умолчанию на свой собственный Console Host в Windows 10. На самом деле, я уже предпринял такую ​​попытку и добился успеха (https://github.com/microsoft/terminal/issues/1817).

Затем Microsoft заявила, что исходный код OpenConsole исходит из conhost.exe, тогда можем ли мы заменить conhost.exe напрямую на OpenConsole.exe? Таким образом мы получим лучший хост консоли по умолчанию.

Я попробовал, и это работает хорошо. Хотя OpenConsole упакован как приложение UWP, OpenConsole.exe на самом деле является обычной программой Win32 window, которую можно запустить двойным щелчком по ее exe. Вы можете найти ее в terminal\bin\x64\Release\OpenConsole.exe, если вы сделали сборку релиза x64.

Затем перейдите в C:\Windows\System32, щелкните правой кнопкой мыши conhost.exe, выберите «Свойства» и отредактируйте список разрешений, чтобы предоставить текущему пользователю разрешение «Полный доступ».

Затем переименуйте conhost.exe в conhost-old.exe и скопируйте OpenConsole.exe сюда, а затем переименуйте его в conhost.exe.

Откройте любое консольное приложение (powershell, wsl, ...) и наслаждайтесь новой консолью.

Также возможно перенести исходный код OpenConsole на Windows 7. Кроме того, поскольку у вас есть исходный код, вы можете добавлять любые необходимые функции.

Кроме того, Microsoft также представила API псевдоконсоли Windows в Windows 10, что позволяет разработчикам более элегантно разрабатывать сторонние терминальные приложения (да, он реализован через conhost.exe и должен быть включен в код, выпущенный Microsoft).

https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/

Вот за что на самом деле отвечает conhost.exe:

(Отhttps://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/)

Основные компоненты консоли включают в себя следующее (снизу вверх):

  • ConDrv.sys – драйвер режима ядра

    • Обеспечивает высокопроизводительный канал связи между консолью и любыми подключенными приложениями командной строки.
    • Пересылает сообщения управления вводом-выводом (IOCTL) между приложениями командной строки и консолью, к которой они «прикреплены»
    • Сообщения IOCTL консоли содержат
      • Данные, представляющие запросы на выполнение вызовов API к экземпляру Console
      • Текст, отправленный из консоли в приложение командной строки
  • ConHost.exe – приложение Win32 GUI:

    • ConHost Core – внутренние компоненты и инфраструктура консоли

      • API-сервер: преобразует сообщения IOCTL, полученные от приложений командной строки, в вызовы API и отправляет текстовые записи из консоли в приложение командной строки.
      • API: реализует API консоли Win32 и логику, лежащую в основе всех операций, которые может выполнить консоль.
      • Буфер ввода: хранит записи событий клавиатуры и мыши, созданные при вводе данных пользователем.
      • Анализатор VT: если включен, анализирует последовательности VT из текста, извлекает все найденное из текста и вместо этого генерирует эквивалентные вызовы API.
      • Буфер вывода: сохраняет текст, отображаемый на дисплее консоли. По сути, это двумерный массив структур CHAR_INFO, которые содержат данные и атрибуты символов каждой ячейки (подробнее о буфере ниже)
      • Другое: Не включено в схему выше, включая настройки инфраструктуры, хранение/извлечение значений из реестра и/или файлов ярлыков и т. д.
    • Службы приложений UX консоли – уровень UX и пользовательского интерфейса консоли

      • Управляет компоновкой, размером, положением и т. д. окна консоли на экране.
      • Отображает и управляет настройками пользовательского интерфейса и т. д.
      • Перекачивает очередь сообщений Windows, обрабатывает сообщения Windows и преобразует пользовательский ввод в записи событий клавиш и мыши, сохраняя их во входном буфере.

решение4

Я бы рекомендовал установить либоPowerShell, который является версией терминала Unix от Microsoft, предназначенной для написания скриптов, передачи по конвейеру и т. д. илиСлужбы Microsoft для Unix(ранее известная как SFU), которая на самом деле является целой подсистемой Posix для Windows, работающей непосредственно поверх ядра (т. е. вместе с WIN32 и Windows API, а не поверх него. опять же, т. е. она не эмулируется, это по сути Unix) и позволит вам использовать любую (ну, большую часть) из *nix-технологий и оболочек. Очень жаль, что Services for Unix не набрала больше оборотов.

Связанный контент