Host de console alternativo para Windows 7/Windows Server 2008

Host de console alternativo para Windows 7/Windows Server 2008

Muitas vezes fico frustrado com o aplicativo host do console do Windows, especialmente com o funcionamento desajeitado da área de transferência, com problemas de largura não automática, etc. Gostaria de saber se existe uma maneira de substituir o host do console padrão conhost.exepor um personalizado e onde poderia Encontro mais informações sobre as interfaces que eu teria que implementar se quisesse escrever as minhas próprias.

Não procuro apenas um console alternativo, já utilizo xtermdo CygWin. Estou procurando informações sobre comosubstituirHost da janela do console padrão do Windows.

Responder1

Abaixo estão alguns bons produtos de substituição de console que são mais fáceis de usar do que o cmd.

Conforme comentado abaixo, desde o Windows 7, todos esses shells são apenas uma interface para o conhost.exe, até mesmo o powershell. Para detalhes, leiaO que é conhost.exe e por que ele está em execução.

Portanto, os consoles abaixo apenas substituem a interface visual padrão do conhost que é aquela exibida pelo cmd, e só são úteis quando invocados diretamente como programas. Eles não podem ser invocados indiretamente, como quando um executável de console como o diskpart é executado, pois isso invocará o conhost, e o conhost possui sua própria interface de E/S e API.

Aqui está o que a Microsoft diz emWindows 7/Windows Server 2008 R2: host do console:

ConHost representa uma mudança permanente na forma como a E/S do aplicativo de console é tratada. Não há chave de registro ou configuração de política de grupo que possa forçar o Windows a reverter para o comportamento do console no “modo legado”.

A conclusão é que se você deseja substituir o console de uma forma mais profunda do que substituir a interface cmd, então isso não é possível. A Microsoft escolheu este design como medida de segurança e não voltará atrás.

A única maneira de pensar em mudar a maneira como o conhost está se comportando é definir um gancho de sistema global na API do conhost. Não sei se isso é possível e ninguém fez isso até agora (ou se o fizeram, não dizem). Também não acredito que a Microsoft permitirá que você substitua um arquivo de sistema tão importante como conhost.exe por uma versão hackeada.

Se for necessária a substituição do cmd, que reside em system32\cmd.exe, é necessário apropriar-se do arquivo e renomeá-lo (cmd1.exe?), renomear o exe de substituição do console para cmd.exe e copiar para system32 junto com todos os arquivos necessários para funcionar. Isso pode causar problemas se o console de substituição não suportar todos os parâmetros do cmd.

Outra abordagem que funciona para arquivos .bat é associar o novo console a eles. Para isso é necessário editar a chave do registro HKEY_CLASSES_ROOT\batfile\shell\open\command. Veja issoartigopara alguns detalhes.

Aqui está a lista de consoles:

ColorConsole
FogoCMD
PowerCmd
GS.EXE
PyCmd

Responder2

Existem programas comoConsoleque envolve cmd.exe e provavelmente pode fornecer o que você está procurando, mas não vi nada tão completo que substitua o sistema do console. AFAIK, a maioria desses tipos de projetos simplesmente redireciona stdin/stdout/stderr e, em seguida, envolve uma GUI mais comum em torno do cmd.exe, ocultando a janela real do console em segundo plano.

Responder3

A Microsoft lançou seu código-fonte conhost.exe (https://github.com/microsoft/terminal).

O código host do console neste repositório é a fonte real a partir da qual o conhost.exe no próprio Windows é construído.

Então agora você tem a oportunidade de substituir o conhost.exe padrão pelo seu próprio Host de Console no Windows 10. Na verdade, já fiz essa tentativa e obtive sucesso (https://github.com/microsoft/terminal/issues/1817).

Então a Microsoft disse que o código-fonte do OpenConsole vem de conhost.exe, então podemos substituir conhost.exe diretamente por OpenConsole.exe? Dessa forma, obtemos um host de console padrão melhor.

Eu tentei e funciona bem. Embora o OpenConsole seja empacotado como um aplicativo UWP, OpenConsole.exe é na verdade um programa de janela Win32 normal que pode ser executado clicando duas vezes em seu exe. Você pode encontrá-lo em terminal\bin\x64\Release\OpenConsole.exe se tiver feito uma versão x64.

Em seguida, vá para C:\Windows\System32, clique com o botão direito em conhost.exe, "Propriedades" e edite a lista de permissões para dar ao usuário atual a permissão "Controle total".

Em seguida, renomeie conhost.exe para conhost-old.exe e copie OpenConsole.exe para aqui e renomeie-o para conhost.exe.

Abra qualquer aplicativo de console (Powershell, WSL, ...) e aproveite seu novo console.

Também é possível portar o código-fonte do OpenConsole para o Windows 7. Além disso, como você tem o código-fonte, pode adicionar os recursos que desejar.

Além disso, a Microsoft também introduziu a API do Windows Pseudo Console no Windows 10, permitindo aos desenvolvedores desenvolver aplicativos de terminal de terceiros com mais elegância (sim, é implementado via conhost.exe e deve ser incluído no código lançado pela Microsoft).

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

Aqui estão as coisas pelas quais conhost.exe é realmente responsável:

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

Os componentes principais do Console consistem no seguinte (de baixo para cima):

  • ConDrv.sys – driver de modo kernel

    • Fornece um canal de comunicação de alto desempenho entre o Console e qualquer aplicativo de linha de comando conectado
    • Transporta mensagens de controle IO (IOCTL) entre aplicativos de linha de comando e o console ao qual eles estão “anexados”
    • As mensagens IOCTL do console contêm
      • Dados que representam solicitações para executar chamadas de API na instância do Console
      • Texto enviado do Console para o aplicativo Command-Line
  • ConHost.exe – aplicativo GUI Win32:

    • ConHost Core – a parte interna e o encanamento do console

      • Servidor API: converte mensagens IOCTL recebidas de aplicativos de linha de comando em chamadas de API e envia registros de texto do console para o aplicativo de linha de comando
      • API: implementa a API e a lógica do console Win32 por trás de todas as operações que o console pode ser solicitado a executar
      • Buffer de entrada: armazena registros de eventos de teclado e mouse gerados pela entrada do usuário
      • Analisador de VT: se ativado, analisa sequências de VT do texto, extrai qualquer texto encontrado e gera chamadas de API equivalentes.
      • Buffer de Saída: Armazena o texto exibido no display do Console. Essencialmente, uma matriz 2D de estruturas CHAR_INFO que contém os dados e atributos de caracteres de cada célula (mais sobre o buffer abaixo)
      • Outros: Não incluídos no diagrama acima incluem configurações de infraestrutura de armazenamento/recuperação de valores do registro e/ou arquivos de atalho, etc.
    • Console UX App Services – a camada Console UX e UI

      • Gerencia o layout, tamanho, posição, etc. da janela do Console na tela
      • Exibe e controla a interface do usuário de configurações, etc.
      • Bombeia a fila de mensagens do Windows, manipula mensagens do Windows e traduz a entrada do usuário em registros de eventos de chave e mouse, armazenando-os no buffer de entrada

Responder4

Eu recomendaria instalar qualquer umPowerShell, que é a versão da Microsoft de um terminal unix destinado a scripts, piping, etc.Serviços Microsoft para Unix(antes conhecido como SFU), que na verdade é um subsistema Posix completo para Windows, operando diretamente sobre o kernel (ou seja, junto com o WIN32 e a API do Windows, não sobre ele. Novamente, ou seja, não é emulado, é basicamente Unix) e permitirá que você use qualquer (bem, a maioria) das tecnologias e shells *nix. É uma pena que os Serviços para Unix não tenham ganhado mais força.

informação relacionada