منذ فتره طويله كنت ادرس برنامج Emulator اسمه PSX2 و هو لتشغيل العاب الـ Playstation 2 على جهاز الـ PC. هذا البرنامج يستخدم GUI و بالإضافه إلى ذلك يستخدم شاشة الـ Console لعرض الـ Log للعمليه الحاليه مع امكانية اخفائها و اظهارها.
حقيقة الفكره عجبتنى فلماذا دائما لابد ان يتم حفظ الـ Log File داخل ملف نصى (طبعا انا بتكلم عن برامج خلاف قواعد البيانات - النوعيه دى انساها خالص دلوقتى)، و لكن المشكله هى انه اما Windows Forms او Console Application.
فى حال استخدامنا للنوع Console Application فلا توجد مشكله و لكن كيف سنقوم بإستخدام شاشة الـ Console و الكتابه فيها و القراءه منها داخل Windows Forms؟
الحل يكمن فى الداله AllocConsole حيث تتيح لك انشاء نسخه من الـ Console للنسخه الحاليه من البرنامج و طبعا توجد الداله FreeConsole لحذف هذه النسخه و مع وجود الداله ShowWindow اصبح بالإمكان اظهار شاشه الـ Console و اخفائها و حيث ان هذه الداله تتطلب معرفة الـ Handle لشاشة الـ Console لذا فمن الضرورى استخدام الداله GetConsoleWindow و التى تعود بمقبض لشاشة الـ Console الخاصه بتلك النسخه من البرنامج سواء كانت ظاهره او مخفيه.
طبعا للعلم الـ Process لا يسمح له بإستخدام اكثر من شاشة Console واحده و بالتالى عند استخدامك لـ AllocConsole مع وجود شاشة Console لن تعمل و ستعود بصفر.
الجميل فى الموضوع هو انك بعد ان تقوم بعمل Allocate لشاشة الـ Console يمكنك استخدام الـ Console Class بشكل كامل مع البرنامج و بدون اى مشاكل
هذه هى الـ Class التى قمت بعملها لتفعيل الـ Console
Class ConsoleHelper Private Declare Function AllocConsole Lib "kernel32.dll" () As Integer Private Declare Function FreeConsole Lib "kernel32.dll" () As Integer Private Declare Function GetConsoleWindow Lib "kernel32.dll" () As IntPtr Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer Public Shared Sub ShowConsole(Optional ByVal show As Boolean = True) Dim hWnd As IntPtr = GetConsoleWindow() Dim i As Integer = If(show = True, 5, 0) ShowWindow(hWnd, i) End Sub Public Shared Function CreateConsole() As Boolean If AllocConsole() <> 0 Then Return True Return False End Function Public Shared Function RemoveConsole() As Boolean If FreeConsole() <> 0 Then Return True Return False End Function End Class
تحتوى الفئه على 3 دوال هما :
1 - CreateConsole : و تقوم بإنشاء نسخة الـ Console و بشكل افتراضى تقوم بإظهارها.
2 - RemoveConsole : تقوم بحذف نسخة الـ Console الخاصه بهذا البرنامج (للنسخه الحاليه فقط) و بالتبعيه تقوم بحذف الشاشه.
3 - ShowConsole : و هى تقوم بإظهار او اخفاء شاشة الـ Console و تستقبل معامل واحد فقط اما True و هو الإفتراضى لإظهار الشاشه او False لإخفائها.
إذا لم يتضح لك فكره عن كيفية الإستفاده من هذه الخاصيه داخل برنامجك دعنى اعطيك فكره.
فالنفترض انك صنعت برنامج ما و الذى يحتوى على GUI و قام عميل بطلب منك (فى الأغلب ممكن يكون مهندس شبكات او system Admin) ان تكون هناك امكانية ان يعمل البرنامج من داخل الـ Command Prompt طبعا الطبيعى انك ستقوم بعمل نسختين، و لكن البديل هنا انك ستقوم بإستخدام الحدث Startup الخاص بـ Application Events و تتحقق من e.CoomandLine فإذا كانت تحتوى على Switch و ليكن مثلا -console فتقوم بإنشاء نسخة من فئه الخاصه بالتعامل مع البرنامج من الـ CommandLine و بعدها سيتم التعامل مع هذه الـ Class و بعد الإنتهاء ستقوم بإستخدام الأمر End لإنهاء البرنامج.
ارجو ان تكون الفكره قد وضحت و عموما فقد ارفقت لكم هذا المثال. لتشغيل البرنامج من الـ CommandLine قم بإستدعاء اسم البرنامج و تمرير معامل -Console ليعمل البرنامج من الـ CommandLine و هذه هى صوره لما سيظهر فى وقت عمل الـ Console فقط
و هذا شكل الـ GUI اثناء عمل البرنامج فى هذا النمط
لتجربة البرنامج فى وضع الـ Console من داخل الـ VS قم بفتح خصائص المشروع ثم حدد الـ Debug Tab ستجد TextBox مكتوب بجانبه CommandLine قم بكتابة -console و احفظ الإعدادات ثم قم بتشغيل البرنامج
و الله ولى التوفيق
