بسم الله الرحمن الرحيم
في برنامج مؤقت الإنترنت الذي سوف نقوم بنشره هنا إن شاء الله راودني فكرة بأن أقوم بقفل سطح المكتب لكي لا يقوم أحد بالعبث فأول شئ قمت به هو إنشاء سطح مكتب جديد ولكن سرعان ما وجدت أن هذه العملية فاشلة نوعاً ما لأن الماسنجرات تقوم بوضع رموزها على System Tray مما أعاق عمل برنامجي فكيف سوف يصل المستخدم إلى تلك الرموز وهو في سطح مكتب جدد فلتجأ لحيلة إخفاء سطح المكتب وهذا الموضوع منقول عن العديد من المقالات التي قمت بقرائتها ولكن قمت بكتابته هنا لتعم الفائدة على الجميع.
في هذا الموضوع سوف نتعرف عن كيفية إخفاء سطح المكتب ومرفقاته
لإخفاء أي نافذه يجب علينا معرفة الـ Handle الذي قام النظام بإسناه له حين عملية إنشاء تلك النافذة ولكننا هنا لا نعرف ماهو الـ Handle لسطح المكتب فكيف ذلك إذا في وظائف النظام هناك وظيفة تقوم بالبحث عن النافذة عن طريق الاسم أو عن طريق الـ ClassName ( هو عبارة عن أسم يقوم المبرمج بإعطائة لنافذة ويمكن أن يتشارك مجموعة من النوافذ في نفس الاسم وهناك مجموعة من هذه الأسماء معرفة مسبقاً داخل نظام التشغيل لإستزاده راجع الـ MSDN لأنه موضع طويل ليس بصدده الأن) والوظيفه هي FindWindow ولكن سوف نسأل ثانية من أين سوف نأتي بأسم سطح المكتب أو الـ ClassName هناك أداة جميلة تأتي مع MicrosoftSDK أسمها SPY تساعدنا بمعرفة متطلباتنا.
1- قم بتشغيل البرنامج SPY وقم بالضغط على Find أو Alt+F3
2- ستضهر لك هذه النافذة قم بالضغط مكان الصورة وأسحب الفارة حيث وجود الكنترول وفي مثالنا هذا قم بالتأشير على مكان تواجد ساعة النظام ثم أضغط على OK
3- سوف ينقلك إلى الصفحة الرئيسية للبرنامج أحفظ الأسم مكان الدائرة الصفراء الظاهر في الصورة
4- أضغط مكان على مفتاح الإنتر أو قم بضغط مرتين على أسم الكنترو (المكان الذي قام البرنامج بتحديده تلقائياً واضح في الصورة السابقة) ثم أحصل على رقم معرف الكنترول وهذه هي الخطوة الأخيرة
نقوم بتنفيذ الخطوت السابقة على جميع العناصر التي نريد إخفائه أما بالنسبة لنوافذ الرئيسة نستثني البند الرابع
وضائف النظام التي سوف نستخدمها هنا
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(
[MarshalAs(UnmanagedType.LPTStr)]
string lpClassName,
[MarshalAs(UnmanagedType.LPTStr)]
string lpWindowName);
// ShowWindow nCmdShow Constant
public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_SHOW = 5;
public const int SW_MINIMIZE = 6;
public const int SW_SHOWMINNOACTIVE = 7;
public const int SW_SHOWNA = 8;
public const int SW_RESTORE = 9;
public const int SW_SHOWDEFAULT = 10;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("User32.dll")]
public static extern IntPtr GetDesktopWindow();
[DllImport("User32.dll")]
public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);لأخفاء سطح المكتب نكتب
//مهمة الوظيفة أن تقوم بإحضار الـ Handle عن طرق الأسم (خاصية لـ Text وليس أسم المتحول)
// أو الـ ClassName الذي تحدثنا عنه سابقأ وهنا وضعنا الـ ClassName ومررنا null لـ الأسم
IntPtr hwnd_DesktopWindow = FindWindow("Progman", null);
ShowWindow(hwnd_DesktopWindow, HideDesktopWindowCheckBox.Checked ? SW_HIDE : SW_SHOW);لإخفاء System Tray نكتب
//نقوم بإحضار مقبض النافذة الأب
IntPtr hwnd_TaskBar = FindWindow("Shell_TrayWnd", null);
// مهمة هذه الوضيفة إحضار أي كونترل موضوعة على النافذة لذلك مرره لها مقبض النافذة الرشيسة
// هنا لـ System Tray هو TaskBar
//قمنا بوضع الرقم الذي حصلنا علية في الخطوات السابقة لعملية البحث
IntPtr hwnd_SystemTray = GetDlgItem(hwnd_TaskBar, 0x12F);
ShowWindow(hwnd_SystemTray, HideSystemTrayCheckBox.Checked ? SW_HIDE : SW_SHOW);مع المرفقات مثال كامل أتمنى أن نكون قد وصلنا لما نريد
لأي سؤال أو أستفسار أسئل ولا تتردد
إثنان لا يتعلمان جاهلً خجول وجاهل متكبر
أذا واجهة مشلكل في قرائة التعليق أنسخ على برنامج الورد.

