重要
Windows Terminal バージョン 1.18 の新しいプロセス モデルには、異なるアプローチが必要です。
新しい実装については、https://github.com/german-one/termwnd を参照してください。
このリポジトリ内のコードの目的は、Conhost プロセスと Windows ターミナル プロセスを区別することと、どのターミナル インスタンスが現在のコンソール プロセスに接続されているかを判断することの両方です。サードパーティのターミナル アプリはサポートされていません。
ソース ファイルは、ほぼ同じコア コードをさまざまなプログラミング言語で転写したものです。
Windows Batch
、 C
、 C++
、 C#.Net
、 PowerShell
、およびVB.Net
のソース ファイルは、 src フォルダーに公開されます。これらはすべて、ターゲット オペレーティング システムである Windows に依存します。その他の特定の依存関係を以下に示します。
ファイル | 要件 |
---|---|
*.bat | Windows PowerShell 2 |
*.c | C99 |
*.cpp | C++20 |
*.cs | .NET フレームワーク 4.5 |
*.ps1 | Windows PowerShell 2 |
*.vb | .NET フレームワーク 4.5 |
このリポジトリ内のソース ファイルには、検索手順の使用方法を示す完全に機能するコードが含まれています。ただし、独自のコードで使用する場合は、どの重要なコード部分を含める必要があるかを知っておくと役立つ場合があります。
ファイル | 対象のコード | 関心のある値 |
---|---|---|
*.bat | :init_TermPid ルーチンで定義されたTermPid マクロ | TermPid マクロによって返される errorlevel は、ホスト端末の PID です (エラーが発生した場合は0 )。 |
*.c | GetTermPid 関数、構造体SYSTEM_HANDLE および関数GetProcBaseName 、 GetPidOfNamedProcWithOpenProcHandle | GetTermPid 関数によって返される値は、ホスト端末の PID です (エラーが発生した場合は0 )。 |
*.cpp | 名前空間termpid 内のすべてと、名前saferes およびGetProcBaseName 関数 | GetTermPid 関数によって返される値は、ホスト端末の PID です ( 0 またはエラーが発生した場合は例外) |
*.cs | クラスWinTerm | WinTerm.TermProc プロパティの値は、ホスト端末プロセスを参照します (エラーが発生した場合はnull または例外)。 |
*.ps1 | 型参照クラスWinTerm | プロパティ[WinTerm]::TermProc の値は、ホスト端末プロセスを参照します (エラーが発生した場合は$null またはタイプWinTerm が定義されていません) |
*.vb | WinTerm モジュール | WinTerm.TermProc プロパティの値は、ホスティング端末プロセスを参照します ( Nothing 、またはエラーが発生した場合は例外) |
数年前、Microsoft は新しいターミナル アプリケーション、Windows Terminal の開発を開始しました。このインストールは Windows 10 で利用でき、Windows 11 にはすでに同梱されています。 2022 年 10 月の更新により、Microsoft はこれを Windows 11 のデフォルトのターミナル アプリに変更しました。
現時点では、Windows Terminal は古き良き Conhost と共存しています。ユーザーは、どれをデフォルトのターミナル アプリとして使用するかを選択できます。
これまでは、どの端末プロセスがシェル/コンソール アプリケーションに接続されているかを把握するのは簡単でした。舞台裏では常に Conhost であったため、Microsoft は、conhost プロセスを生成するプロセスを端末プロセスとして報告し、シェル アプリケーションのウィンドウをコンソール ウィンドウとして報告する Windows API を作成しました。これらはすべて技術的に間違っていますが、同時に非常に快適です。
ただし、Windows ターミナルにはそのような便利な機能は実装されていません。また、Windows ターミナルがデフォルトのターミナルとして設定されている場合、どのターミナル プロセスがシェル プロセスと通信しているかをプロセス ツリーから推測することはできません。
Process Explorer を使用すると、Windows ターミナル プロセスがシェル プロセスへのハンドルを開いていることがわかりました。これが常に当てはまると仮定して、正しいプロセス ハンドルを検索して開いているすべてのハンドルを列挙するコードを作成しようとしました。これには、文書化されていない API が必要になります。コード内に、これがどのように機能するかを大まかに説明するコメントをいくつか残しました。
各ファイルには、ウィンドウをフェードアウトしたりフェードインしたりする無関係なコードも含まれています。これは、正しいプロセスが見つかったことを証明する素晴らしい方法だと思いました。
これは、ソース コードで検索がどのように実装されるかを簡単に説明したものです。
NtQuerySystemInformation
API 関数は、実行中のすべてのプロセスで開いているすべてのハンドルのスナップショットを取得するために使用されます。 (これは正式に文書化されていません。)