مهم
يتطلب نموذج العملية الجديد لإصدار Windows Terminal 1.18 أسلوبًا مختلفًا.
ارجع إلى https://github.com/german-one/termwnd للتعرف على التنفيذ الجديد.
الغرض من التعليمات البرمجية الموجودة في هذا المستودع هو التمييز بين عمليات Conhost وWindows Terminal وتحديد المثيل الطرفي المتصل بعملية وحدة التحكم الحالية. تطبيقات الطرف الثالث غير مدعومة.
الملفات المصدر عبارة عن نسخ لنفس الكود الأساسي تقريبًا في لغات برمجة مختلفة.
يتم نشر الملفات المصدر في Windows Batch
و C
و C++
و C#.Net
و PowerShell
و VB.Net
في المجلد src. تعتمد جميعها على كون Windows هو نظام التشغيل المستهدف. التبعيات المحددة الأخرى مذكورة أدناه.
ملف | متطلبات |
---|---|
*.bat | ويندوز باورشيل 2 |
*.c | C99 |
*.cpp | سي++20 |
*.cs | صافي الإطار 4.5 |
*.ps1 | ويندوز باورشيل 2 |
*.vb | صافي الإطار 4.5 |
تحتوي الملفات المصدر الموجودة في هذا المستودع على تعليمات برمجية كاملة الوظائف توضح كيفية استخدام إجراء البحث. ومع ذلك، إذا كنت تنوي استخدامه في التعليمات البرمجية الخاصة بك، فقد يكون من المفيد معرفة الأجزاء الأساسية من التعليمات البرمجية التي تحتاج إلى تضمينها.
ملف | رمز الفائدة | قيمة الفائدة |
---|---|---|
*.bat | ماكرو TermPid محدد في روتين :init_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 أو استثناء في حالة حدوث خطأ) |
منذ بضع سنوات مضت، بدأت Microsoft في تطوير تطبيق طرفي جديد - Windows Terminal. التثبيت متاح لنظام التشغيل Windows 10، ويأتي معه Windows 11 بالفعل. من خلال تحديث في أكتوبر 22، حولته Microsoft إلى التطبيق الطرفي الافتراضي على نظام التشغيل Windows 11.
اعتبارًا من الآن، تتعايش Windows Terminal مع Conhost القديم الجيد. يمكن للمستخدمين اختيار التطبيق الذي سيتم اعتباره التطبيق الطرفي الافتراضي الخاص بهم.
في الماضي، كان من السهل معرفة العملية الطرفية المتصلة بتطبيق shell/وحدة التحكم. خلف الكواليس كان Conhost دائمًا، وبالتالي، قامت Microsoft بإعداد Windows API للإبلاغ عن العملية التي أدت إلى ظهور عملية conhost باعتبارها العملية الطرفية، والإبلاغ عن نافذة تطبيق shell كنافذة وحدة التحكم. في حين أن كل هذا غير صحيح من الناحية الفنية، إلا أنه مريح للغاية في نفس الوقت.
ومع ذلك، لم يتم تنفيذ مثل هذه الوظيفة الملائمة لـ Windows Terminal. وإذا تم تعيين Windows Terminal كمحطة افتراضية، فلا يمكننا الاستدلال من شجرة العملية على العملية الطرفية التي تتصل بعملية الصدفة الخاصة بنا.
باستخدام Process Explorer، لاحظت أن عملية Windows Terminal لها مؤشر لعملية الصدفة المفتوحة. بافتراض أن هذا هو الحال دائمًا، حاولت كتابة جزء من التعليمات البرمجية الذي يعدد جميع المقابض المفتوحة التي تبحث عن مقبض العملية الصحيح. يتطلب هذا تضمين بعض واجهات برمجة التطبيقات (API) غير الموثقة. لقد تركت تعليقين في الكود يشرحان تقريبًا كيفية عمل كل هذا.
يوجد في كل ملف أيضًا جزء من التعليمات البرمجية غير ذات الصلة التي تعمل على إخفاء النافذة للخارج والداخل مرة أخرى. لقد وجدت أنها طريقة رائعة لإثبات أنه تم العثور على العملية الصحيحة.
هذا شرح مختصر لكيفية تنفيذ البحث في أكواد المصدر.
NtQuerySystemInformation
API للحصول على لقطة لجميع المقابض المفتوحة في كافة العمليات الجارية. (وهذا لم يتم توثيقه رسميا).