كيفية تشغيل حافظة الشاشة برمجيا

This article is available in English too, check it out here.

نظرة خاطفة

درسنا اليوم يتكلم عن طريقة تشغيل حافظة الشاشة Screen Saver برمجيا. هناك عدة طرق لتشغيل حافظة الشاشة سوف نقوم بسردها جميعا بإذن الله تعالى.

مقدمة

في الويندوز يمكنك تشغيل حافظة الشاشة Screen Saver عن طريق ترك جهازك بدون تحريك الفأرة أو لوحة المفاتيح لمدة فترة زمنية معينة تقوم بتحديدها من خلال خيارات Screen Saver من خصائص سطح المكتب.

Screen Saver Settings

ماذا لو أردت فعل ذلك برمجيا؟ ماذا لو أردت تشغيل حافظة الشاشة عند نقطة معينة من البرنامج؟ بالطبع أنت لا تريد منع المستخدم من تحريك الفأرة أو استخدام لوحة المفاتيح حتى تنتهي الفترة المحددة بل تريد تشغيلها تلقائيا وهذا يمكنك عمله بأحد طرق ثلاثة:

  1. تشغيل ملف حافظة الشاشة برمجيا. حيث أن حافظات الشاشة هي عبارة عن ملفات لها الامتداد SCR. فيمكنك برمجيا على سبيل المثال باستخدام الدالة System.Diagnostics.Process.Start() تشغيل ملف SCR المحدد. ملاحظة: غالبية حافظات الشاشة ستجدها في المسار %windir%\System32.
  2. المشكلة في الطريقة السابقة أنها لا توفر لك طريقة لمعرفة أي من حافظات الشاشة هو الذي اختاره المستخدم في شاشة Screen Saver Settings. انظر الشكل السابق. فيمكنك التغلب على هذه المشكلة عن طريق معرفة حافظة الشاشة التي حددها المستخدم عن طريق مكتب التسجيل Registry. فحافظة الشاشة يتم تسجيل المسار الخاص بها في المفتاح Key المسمى SCRNSAVE.EXE الموجود في HKEY_CURRENT_USER\Control Panel\Desktop. فيمكنك دمج هذه الطريقة مع الطريقة السابقة لتشغيل الحافظة المحددة من المستخدم.
  3. الطريقة الأخيرة وهي الأصعب ولكنها الأقوى وهي أن تقوم باستخدام دوال الويندوز أي Win32 API Functions لتشغيل حافظة الشاشة ويتم ذلك عن طريق الدالة SendMessage() والتي يمكنك إعطائها مدخلات معينة لتشغيل حافظة الشاشة.

الطريقة الأولى والثانية هي ليست طرق لتشغيل الحافظة فعليا بل هي لتجربتها كأنك تقوم بالضغط على زر Preview في لوحة تحكم حافظة الشاشة. أما الطريقة الثالثة فهي تقوم بتشغيلها فعليا حتى أنك عند الخروج منها يطلب منك إدخال كلمة سر النظام واسم المستخدم وهذا إذا كان لك كلمة سر وأنك قمت باختيار هذه الخاصية من لوحة التحكم.

التطبيق

تشغيل حافظة الشاشة باستخدام المسار

وهذه هي الطريقة الثانية مدمجة مع الأولى أي أننا سوف نقوم بقراءة مسار ملف حافظة الشاشة المختارة من الـ Registry ثم سوف نقوم بتشغيله. لاحظ الكود.

// C# Code
using System;
using Microsoft.Win32;
class Program
{
    static void Main()
    {
        string path = Registry.CurrentUser
            .OpenSubKey("Control Panel")
            .OpenSubKey("Desktop")
            .GetValue("SCRNSAVE.EXE").ToString();
        Console.WriteLine("Current Screen Saver: \n{0}",
            path);
        Console.WriteLine("Press any key to continue . . .");
        Console.ReadKey(true);
        System.Diagnostics.Process.Start(path);
        Console.WriteLine("Press any key to continue . . .");
        Console.ReadKey(true);  // Wait for the Screen Saver
    }
}
' VB.NET Code
Imports System
Imports Microsoft.Win32
Module Program
    Sub Main()
        Dim path As String = Registry.CurrentUser _
        .OpenSubKey("Control Panel") _
        .OpenSubKey("Desktop") _
        .GetValue("SCRNSAVE.EXE").ToString()
        Console.WriteLine("Current Screen Saver: {0}{1}", _
            Environment.NewLine, path)
        Console.WriteLine("Press any key to continue . . .")
        Console.ReadKey(True)
        System.Diagnostics.Process.Start(path)
        Console.WriteLine("Press any key to continue . . .")
        Console.ReadKey(True)  ' Wait for the Screen Saver
    End Sub
End Module

تشغيل حافظة الشاشة باستخدام دوال ويندوز

هذه هي الطريقة الثالثة التي تكلمنا عنها. فالدالة التي نريدها هي دالة SendMessage() وهي موجودة في المكتبة الخاصة بالويندوز المسماة user32.dll. وهذه الدالة ترسل أمرا معينا إلى عنصر معين. فعلى سبيل المثال يمكنك إرسال أمر تصغير الشاشة Minimize إلى نافذة معينة أو حتى إلى جميع النوافذ وهكذا. وهذه الدالة معرفة كالتالي:

LRESULT SendMessage(
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

تأخذ هذه الدالة 4 مدخلات وهي على الترتيب:

  • hWnd:
    العنصر الذي سوف يتم إرسال الأمر إليه. في مثالنا هذا سوف نحدد HWND_BROADCAST وهذا لتحديد جميع النوافذ لنرسل إليها الأمر حتى لا تعرقل أحدها أمر التشغيل.
  • Msg:
    نوع الأمر لإرساله. في مثالنا هذا سوف نقوم بتحديد WM_SYSCOMMAND وهي معناها أمر خاص بالويندوز.
  • wParam:
    خصائص خاصة بالأمر. في مثالنا هذا سوف نقوم بتحديد الخاصية SC_SCREENSAVE وهي معناها تشغيل حافظة الشاشة.
  • lParam:
    خصائص أخرى خاصة بالأمر. في مثالنا هذا لن نقوم بتحديدها.

إذا لتشغيل حافظة الشاشة سوف نقوم بتحديد الأمر WM_SYSCOMMAND وهو معناه أننا نريد أن نرسل أمرا خاصا بالويندوز. وسوف نقوم بتحديد الخاصية SC_SCREENSAVE وهي معاناها أن هذه الأمر هو أمر تشغيل حافظة الشاشة. وبالطبع سوف يرسل هذا الأمر ومعه هذه الخاصية إلى جميع النوافذ وذلك لكي لا تعرقل أحدها هذا الأمر.

بداية وقبل النداء على الدالة تعرف بالطبع أنه لا يمكنك النداء على دوال الويندوز Win32 API Functions مباشرة بل يجب أن تقوم بتعريفها في بيئة الدوت نت أولا ثم النداء عليها. والتعريف في بيئة الدوت نت يسمى Platform Invokation أو PInvoke. لاحظ دالة التعريف ومعها الخصائص والأوامر التي نريدها.  لاحظ أيضا أن نظام التعريف ثابت في جميع دوال الويندوز فقط قم بتغيير اسم الدالة ومكانها والمدخلات الخاصة بها في الدوال الأخرى.

إذا كنت في C# يجب عليك إضافة أمر using للـ Namespace المسماة System.Runtime.InteropServices وذلك لأجل العنصر DllImport.

// C# Code
[DllImport("User32.dll")]
static extern int SendMessage
    (IntPtr hWnd,
    uint Msg,
    uint wParam,
    uint lParam);
const uint WM_SYSCOMMAND = 0x112;
const uint SC_SCREENSAVE = 0xF140;
const uint HWND_BROADCAST = 0xFFFF;
' VB.NET Code
Declare Auto Function SendMessage Lib "user32.dll" _
    (ByVal hWnd As IntPtr, _
    ByVal Msg As UInt32, _
    ByVal wParam As UInt32, _
    ByVal lParam As UInt32) As Int32
Const WM_SYSCOMMAND As UInt32 = &h212
Const SC_SCREENSAVE As UInt32 = &HF140
Const HWND_BROADCAST As UInt32 = &HFFFF

والآن قم بالنداء بسهولة جدا على الدالة كي تقوم بتشغيل حافظة الشاشة:

// C# Code
static void Main()
{
    SendMessage(
        new IntPtr((int)HWND_BROADCAST),
        WM_SYSCOMMAND,
        SC_SCREENSAVE,
        0);
}
' VB.NET Code
Sub Main()
    SendMessage( _
        New IntPtr(CInt(HWND_BROADCAST)), _
        WM_SYSCOMMAND, _
        SC_SCREENSAVE, _
        0)
End Sub

لاحظ أن هذه هي الطريقة الأصح لتشغيل حافظة الشاشة وذلك لأن الطريقة السابقة عبارة عن تشغيل برنامج أي أنك تستعرض حافظة الشاشة ولست تشغلها فعليا حتى أنك لا يطلب منك إدخال كلمة سر النظام عن الخروج من حافظة الشاشة وذلك إذا كنت محدد هذا الاختيار.

خاتمة

تعلمنا في هذا الدرس ليس فقط كيفية تشغيل حافظة الشاشة بل تعلمنا أيضا كيفية النداء على دوال الويندوز وأحد الدوال المهمة جدا وهي دالة إرسال الأوامر الدالة SendMessage(). وفي الدروس القادمة بإذن الله تعالى سنتعلم كيفية استخدام هذه الدالة لتنفيذ أوامر أكثر.

مواضيع مشابهة:

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...