PENTING
Model proses baru Terminal Windows versi 1.18 memerlukan pendekatan yang berbeda.
Lihat https://github.com/german-one/termwnd untuk implementasi baru.
Tujuan kode dalam repositori ini adalah untuk membedakan antara proses Conhost dan Terminal Windows dan untuk menentukan instance terminal mana yang terhubung ke proses konsol saat ini. Aplikasi terminal pihak ketiga tidak didukung.
File sumber adalah transkripsi kode inti yang hampir sama dalam bahasa pemrograman berbeda.
File sumber di Windows Batch
, C
, C++
, C#.Net
, PowerShell
, dan VB.Net
diterbitkan di folder src. Semuanya bergantung pada Windows sebagai sistem operasi target. Dependensi spesifik lainnya tercantum di bawah ini.
Mengajukan | Persyaratan |
---|---|
*.bat | Windows PowerShell 2 |
*.c | Bab 99 |
*.cpp | C++20 |
*.cs | .NET Kerangka 4.5 |
*.ps1 | Windows PowerShell 2 |
*.vb | .NET Kerangka 4.5 |
File sumber dalam repositori ini berisi kode yang berfungsi penuh yang menunjukkan cara menggunakan prosedur pencarian. Namun, jika Anda ingin menggunakannya dalam kode Anda sendiri, mungkin berguna untuk mengetahui bagian penting mana dari kode yang perlu Anda sertakan.
Mengajukan | Kode minat | Nilai yang menarik |
---|---|---|
*.bat | Makro TermPid ditentukan dalam rutinitas :init_TermPid | tingkat kesalahan yang dikembalikan oleh makro TermPid adalah PID terminal hosting ( 0 jika terjadi kesalahan) |
*.c | Fungsi GetTermPid , beserta struktur SYSTEM_HANDLE dan fungsi GetProcBaseName , GetPidOfNamedProcWithOpenProcHandle | nilai yang dikembalikan oleh fungsi GetTermPid adalah PID terminal hosting ( 0 jika terjadi kesalahan) |
*.cpp | semua yang ada di namespace termpid , bersama dengan saferes namespace dan fungsi GetProcBaseName | nilai yang dikembalikan oleh fungsi GetTermPid adalah PID terminal hosting ( 0 atau pengecualian jika terjadi kesalahan) |
*.cs | kelas WinTerm | nilai properti WinTerm.TermProc mengacu pada proses terminal hosting ( null atau pengecualian jika terjadi kesalahan) |
*.ps1 | Ketik kelas referensi WinTerm | nilai properti [WinTerm]::TermProc mengacu pada proses terminal hosting ( $null atau ketik WinTerm tidak ditentukan jika terjadi kesalahan) |
*.vb | Modul WinTerm | nilai properti WinTerm.TermProc mengacu pada proses terminal hosting ( Nothing atau pengecualian jika terjadi kesalahan) |
Beberapa tahun yang lalu Microsoft mulai mengembangkan aplikasi terminal baru - Terminal Windows. Instalasi tersedia untuk Windows 10, dan Windows 11 sudah disertakan dengannya. Dengan pembaruan pada bulan Oktober '22, Microsoft mengubahnya menjadi aplikasi terminal default di Windows 11.
Sampai sekarang, Terminal Windows hidup berdampingan dengan Conhost lama yang bagus. Pengguna dapat memilih mana yang diambil sebagai aplikasi terminal default mereka.
Di masa lalu, mudah untuk mengetahui proses terminal mana yang terhubung ke aplikasi shell/konsol. Di belakang layar selalu Conhost dan dengan demikian, Microsoft membuat Windows API melaporkan proses yang melahirkan proses conhost sebagai proses terminal, dan melaporkan jendela aplikasi shell sebagai jendela konsol. Meskipun semua ini secara teknis salah, namun pada saat yang sama cukup nyaman.
Namun, tidak ada fungsionalitas kenyamanan yang diterapkan untuk Terminal Windows. Dan jika Terminal Windows ditetapkan sebagai terminal default, kita tidak dapat menyimpulkan dari pohon proses proses terminal mana yang berkomunikasi dengan proses shell kita.
Menggunakan Process Explorer Saya mengamati bahwa proses Terminal Windows memiliki pegangan untuk proses shell terbuka. Dengan asumsi bahwa hal ini selalu terjadi, saya mencoba menulis sepotong kode yang menyebutkan semua pegangan terbuka untuk mencari pegangan proses yang tepat. Ini memerlukan keterlibatan beberapa API yang tidak berdokumen. Saya meninggalkan beberapa komentar di kode yang secara kasar menjelaskan cara kerjanya.
Di setiap file juga ada bagian kode yang tidak terkait yang membuat jendela keluar dan masuk lagi. Menurut saya, ini adalah cara yang mengesankan untuk membuktikan bahwa proses yang benar telah ditemukan.
Ini adalah penjelasan singkat tentang bagaimana pencarian diimplementasikan dalam kode sumber.
NtQuerySystemInformation
API digunakan untuk mendapatkan snapshot dari semua pegangan terbuka di semua proses yang berjalan. (Ini tidak didokumentasikan secara resmi.)