私は、Windows のコンソール ホスト アプリケーション、特にクリップボードの動作の不便さや、自動幅設定の問題などにしばしばイライラしています。デフォルトのコンソール ホストをconhost.exe
カスタム コンソール ホストに置き換える方法があるかどうか、また、独自に作成する場合に実装する必要があるインターフェイスに関する詳細情報をどこで入手できるかを知りたいです。
私は代替コンソールを探しているのではなく、すでにxterm
CygWinを使用しています。交換するWindows のデフォルトのコンソール ウィンドウ ホスト。
答え1
以下は、cmd よりもユーザーフレンドリーな、優れたコンソール代替製品です。
以下にコメントされているように、Windows 7以降、これらすべてのシェルは、PowerShellも含めてconhost.exeへのインターフェイスにすぎません。詳細については、以下をお読みください。conhost.exe とは何か、なぜ実行されるのか。
したがって、以下のコンソールは、cmd によって表示される conhost のデフォルトのビジュアル インターフェイスを置き換えるだけであり、プログラムとして直接呼び出される場合にのみ役立ちます。diskpart などのコンソール実行可能ファイルを実行する場合のように間接的に呼び出すことはできません。これは、これにより conhost が呼び出され、conhost には独自の I/O インターフェイスと API があるためです。
マイクロソフトは次のように述べている。Windows 7 / Windows Server 2008 R2: コンソール ホスト:
ConHost は、コンソール アプリケーションの I/O の処理方法の永続的な変更を表します。Windows を強制的に「レガシ モード」のコンソール動作に戻すことができるレジストリ キーやグループ ポリシー設定はありません。
結論としては、cmd インターフェイスを置き換えるよりも深いレベルでコンソールを置き換えたい場合、これは不可能です。Microsoft はセキュリティ対策としてこの設計を選択しており、元に戻るつもりはありません。
conhost の動作を変更する方法として私が思いつくのは、conhost API にグローバル システム フックを設定することだけです。これが可能かどうかはまったくわかりませんし、これまで誰もこれを実行したことがありません (実行したとしても、そのことを明かしていません)。また、Microsoft が conhost.exe のような極めて重要なシステム ファイルをハッキングされたバージョンに置き換えることを許可するとは思えません。
system32\cmd.exe にある cmd を置き換える必要がある場合は、ファイルの所有権を取得して名前を変更し (cmd1.exe?)、コンソール置換 exe の名前を cmd.exe に変更して、動作に必要なすべてのファイルとともに system32 にコピーする必要があります。置換コンソールが cmd のすべてのパラメータをサポートしていない場合、問題が発生する可能性があります。
.batファイルで機能する別の方法は、新しいコンソールをそれらに関連付けることです。これにはレジストリキーを編集する必要がありますHKEY_CLASSES_ROOT\batfile\shell\open\command
。こちらを参照してください。記事詳細については。
コンソールのリストは次のとおりです:
答え2
次のようなプログラムがありますコンソールcmd.exe をラップして、おそらくあなたが探しているものを提供できるでしょうが、コンソール システムを完全に置き換えるものは見たことがありません。私の知る限り、これらの種類のプロジェクトのほとんどは、stdin/stdout/stderr をリダイレクトし、cmd.exe の周囲にもっと一般的な GUI をラップして、実際のコンソール ウィンドウをバックグラウンドで隠しています。
答え3
Microsoftはconhost.exeのソースコードを公開しました(ターミナル)。
このリポジトリ内のコンソール ホスト コードは、Windows 自体の conhost.exe が構築される実際のソースです。
これで、Windows 10 でデフォルトの conhost.exe を独自のコンソールホストに置き換える機会ができました。実際、私はすでにそのような試みを行って成功しました (参考:)。
Microsoft によると、OpenConsole のソース コードは conhost.exe から取得されるため、conhost.exe を OpenConsole.exe に直接置き換えることはできますか? この方法では、より優れた既定のコンソール ホストが得られます。
試してみたところ、うまくいきました。OpenConsole は UWP アプリケーションとしてパッケージ化されていますが、OpenConsole.exe は実際には exe をダブルクリックして実行できる通常の Win32 ウィンドウ プログラムです。x64 リリース ビルドを行った場合は、terminal\bin\x64\Release\OpenConsole.exe から見つけることができます。
次に、C:\Windows\System32 に移動し、conhost.exe を右クリックして「プロパティ」を選択し、権限リストを編集して現在のユーザーに「フル コントロール」権限を付与します。
次に、conhost.exe の名前を conhost-old.exe に変更し、OpenConsole.exe をここにコピーして、conhost.exe に名前を変更します。
任意のコンソール アプリケーション (powershell、wsl など) を開いて、新しいコンソールをお楽しみください。
OpenConsole のソース コードを Windows 7 に移植することも可能です。また、ソース コードがあるので、必要な機能を追加することもできます。
さらに、Microsoft は Windows 10 で Windows 擬似コンソール API も導入し、開発者がサードパーティのターミナル アプリケーションをよりエレガントに開発できるようにしました (はい、これは conhost.exe を介して実装されており、Microsoft がリリースするコードに含まれているはずです)。
conhost.exe が実際に担当する内容は次のとおりです。
(からhttps://devblogs.microsoft.com/commandline/windows-command-line-inside-the-windows-console/)
コンソールのコア コンポーネントは、下から順に次のものから構成されます。
ConDrv.sys – カーネルモード ドライバー
- コンソールと接続されたコマンドラインアプリ間の高性能通信チャネルを提供します。
- コマンドラインアプリとそれが「接続」されているコンソールの間でIO制御(IOCTL)メッセージをやり取りします。
- コンソールIOCTLメッセージには
- コンソールインスタンスに対してAPI呼び出しを実行するためのリクエストを表すデータ
- コンソールからコマンドラインアプリに送信されたテキスト
ConHost.exe – Win32 GUI アプリ:
ConHost Core – コンソールの内部と配管
- API サーバー: コマンドライン アプリから受信した IOCTL メッセージを API 呼び出しに変換し、コンソールからコマンドライン アプリにテキスト レコードを送信します。
- API: Win32 コンソール API と、コンソールに実行を要求できるすべての操作の背後にあるロジックを実装します。
- 入力バッファ: ユーザー入力によって生成されたキーボードとマウスのイベントレコードを保存します。
- VTパーサー: 有効にすると、テキストからVTシーケンスを解析し、テキストから見つかったものを抽出し、代わりに同等のAPI呼び出しを生成します。
- 出力バッファ: コンソールのディスプレイに表示されるテキストを保存します。基本的には、各セルの文字データと属性を含む CHAR_INFO 構造体の 2D 配列です (バッファについては後述します)。
- その他: 上記の図には、レジストリやショートカット ファイルなどから値を保存/取得する設定インフラストラクチャは含まれていません。
コンソール UX アプリ サービス – コンソール UX および UI レイヤー
- 画面上のコンソールウィンドウのレイアウト、サイズ、位置などを管理します。
- 設定UIなどを表示・処理します。
- Windows メッセージ キューをポンプし、Windows メッセージを処理し、ユーザー入力をキーおよびマウス イベント レコードに変換して、入力バッファーに格納します。
答え4
どちらかをインストールすることをお勧めしますパワーシェル、これはスクリプトやパイプ処理などを目的としたMicrosoft版のUNIXターミナル、またはMicrosoft Unix 向けサービス(かつては SFU と呼ばれていました) これは実際には Windows 用の完全な Posix サブシステムであり、カーネル上で直接動作します (つまり、WIN32 および Windows API と並行して動作します。その上ではありません。繰り返しますが、エミュレートされているわけではなく、基本的には Unix です)。これにより、*nix テクノロジとシェルのすべて (まあ、ほとんど) を使用できるようになります。Services for Unix がもっと普及していないのは本当に残念です。