重要的
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 巨集傳回的錯誤等級是託管終端的 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 或異常) |
幾年前微軟開始開發新的終端應用程式-Windows Terminal。此安裝適用於 Windows 10,Windows 11 已隨附此安裝。透過 22 年 10 月的更新,微軟將其變成了 Windows 11 上的預設終端應用程式。
截至目前,Windows Terminal 與舊的 Conhost 共存。使用者可以選擇將哪個應用程式作為預設終端應用程式。
過去,很容易找出哪個終端進程連接到 shell/控制台應用程式。在幕後它始終是 Conhost,因此,Microsoft 讓 Windows API 將產生 conhost 進程的進程報告為終端進程,並將 shell 應用程式的視窗報告為控制台視窗。雖然這一切在技術上都是不正確的,但同時卻相當舒適。
但是,Windows 終端並沒有實現此類便利功能。如果Windows Terminal被設定為預設終端,我們就無法從進程樹推斷哪個終端進程正在與我們的shell進程通訊。
使用 Process Explorer,我觀察到 Windows 終端進程有一個開啟的 shell 進程的句柄。假設情況總是如此,我嘗試編寫一段程式碼來列舉所有開啟的句柄,以搜尋正確的進程句柄。這就需要牽涉到一些未公開的API。我在程式碼中留下了一些註釋,大致解釋了這一切是如何運作的。
每個檔案中還有一段不相關的程式碼,用於使視窗淡出並再次淡入。我發現這是一種令人印象深刻的方式來證明已經找到了正確的流程。
這是如何在原始程式碼中實現搜尋的簡要說明。
NtQuerySystemInformation
API 函數用於取得所有正在執行的進程中所有開啟句柄的快照。 (這沒有正式記錄。)