ها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتری هستند که از تاریخچه‌ای طولانی برخوردار هستند. در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده میشود.
Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتر میباشند که دارای تاریخچه‌ای طولانی هستند. تقریبا'' از همان اوایل بوجود آمدن کامپیوترهای شخصی این برنامه‌ها توانستند کاربران زیادی را جذب خود کنند. Screen Saver یا محافظ صفحه نمایش برنامه‌ایست که پس از مدت زمان مشخصی که کاربر با صفحه کلید کار نکند یا ماوس را حرکت ندهد، مانیتور را فعال نموده و یا در آن تصویری را نمایش می‌دهد. تماس با صفحه کلید یا ماوس، محافظ صفحه نمایش را از فعالیت باز می‌دارد. بند فوق تعریفی از Screen Saver است که مبنای ساخت یک محافظ صفحه نمایش نیز بر همین اساس است. برای ساخت یک محافظ صفحه نمایش دو کار اصلی وجود دارد:


ساخت برنامه محافظ صفحه نمایش
تبدیل آن به فرمت scr. و قرار دادن آن در لیست Screen Saverهای ویندوز

در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده می‌شود. الگوریتم این برنامه بسیار ساده بوده و در صورتیکه به زبانهای دیگر نیز تسلط دارید میتوانید این الگوریتم را با زبان دلخواهتان پیاده سازی کنید. همانطور که گفته شد ساخت چنین برنامه ای از دو قسمت تشکیل شده است که برای هر قسمت یک Project لازم است.


بخش اول – ساخت برنامه محافظ صفحه نمایش
یک پروژه جدید باز کنید و اسم Screen Saver دلخواه خود را بر روی آن بگذارید. اولین کار شما تنظیم برخی از خصوصیات فرمتان میباشد که تمامی آنها برای ساختن برنامه حیاتی می‌باشند. خصوصیات فرم خود را مانند زیر تنظیم کنید:

Property Value
FormBorderstyle None
WindowState Maximized
ControlBox None
MaximizeBox None
MinimizeBox None
ShowInTaskbar False
TopMost True

با این تنظیمات فرم شما در هنگام اجرا تمام صفحه را در بر خواهد گرفت. حالا شما می‌توانید هنرهای خود را روی فرم پیاده کنید. اما عجله نکنید. هنوز چند تا کار باقی مانده است. باید کاری کنیم که هنگامی که کاربر ماوس را حرکت میدهد برنامه خاتمه یابد. برای این منظور به سراغ رویداد MouseMove فرم می‌رویم. کد زیر را در این رویداد بنویسید:


If Not m_IsActive Then
Me.m_MouseLocation = New Point(e.X, e.Y)
m_IsActive = True
Else
If Math.Abs(e.X - Me.m_MouseLocation.X) > 10 Or _
Math.Abs(e.Y - Me.m_MouseLocation.Y) > 10 Then
Application.Exit()
End If
End If

شاید این کدها کمی عجیب به نظر برسند! اما این طور نیست. m_IsActive در کد فوق یک متغیر سطح ماژول Boolean و با مقدار اولیه False می‌باشد. m_MouseLocation نیز یک متغیر سطح ماژول از نوع Point می‌باشد. هر بار که رویداد فوق اجرا میشود (یعنی وقتی که ماوس حرکت داده می‌شود) نقطه‌ای که ماوس در آن نقطه بوده است درون متغیر m_MouseLocation ذخیره میشود. این مقدار با مقادیر بعدی محل قرار گرفتن ماوس مقایسه شده و در صورتی که تغییر مکان ماوس بیش از 10 پیکسل باشد برنامه اتمام میابد. این تکنیک بدین منظور ارائه شده تا برنامه با هر حرکت کوچک ماوس خاتمه نیابد.

شما می‌توانید در رویدادهای دیگر مانند MouseDown و KeyPress نیز کد زیر را قرار دهید تا برنامه شما کامل شود:


Application.Exit()

حال شما به یک تایمر جهت اجرای حرکاتی بر روی فرم نیاز دارید. پس از اضافه کردن تایمر به برنامه به رویداد Load فرم رفته و کدهای زیر را وارد کنید :


Me.Cursor.Hide()
Me.m_Graphics = Me.CreateGraphics()
Me.Timer1.Enabled = True

ابتدا مکان نما را مخفی می‌کنیم و سپس تایمر برنامه را به کار می اندازیم. در این جا یک متغیر سطح ماژول از نوع Graphics را نیز ساخته و به فرم خود نسبت داده‌ایم که این شئ گرافیکی برای کشیدن اشکالی بر روی فرم بکار می‌رود.

به رویداد Tick تایمر برنامه میرویم و زیر برنامه مربوط به کشیدن اشکال را فراخوانی می‌کنیم:


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick

DrawShape()
End Sub

زیر برنامه DrawShape در این برنامه به صورت Random و با رنگهای Random مستطیل‌هایی را رسم میکند. کدهای این زیر برنامه در زیر آورده شده است:


Private Sub DrawShape()
Dim maxX As Integer = Me.Width
Dim maxY As Integer = Me.Height
Dim x1, x2, y1, y2 As Integer
Dim myRect As Rectangle
Dim myColor As Color

x1 = m_Random.Next(0, maxX)
x2 = m_Random.Next(0, maxX)

y1 = m_Random.Next(0, maxY)
y2 = m_Random.Next(0, maxY)

myRect = New Rectangle(Math.Min(x1, x2), Math.Min(y1, y2), _
Math.Abs(x1 - x2), Math.Abs(y1 - y2))

myColor = Color.FromArgb(255, m_Random.Next(255), _
m_Random.Next(255), m_Random.Next(255))

m_Graphics.FillRectangle(New SolidBrush(myColor), myRect)
End Sub

تا اینجا Screen Saver ما آماده است ولی هنوز یک کار دیگر باقی مانده است. هنگامی که ویندوز این فایل را اجرا میکند پارامترهایی را به برنامه ارسال میکند. این پارامترها عبارتند از ''/c'' ''/s'' ''/p'' که معنی هر کدام در ادامه بیان خواهد شد. برای بررسی هر کدام از این پارامترها باید از متد زیر استفاده کرد:



Shared Sub Main(ByVal args As String())

End Sub

این زیر برنامه اولین زیر برنامه‌ایست که پس از راه اندازی برنامه اجرا خواهد شد. پس مکان مناسبی برای بررسی این پارامترهاست. ابتدا با شرط زیر بررسی می‌کنیم که آیا پارامتری به برنامه ارسال شده است یا خیر؟


If args.Length > 0 Then
...
Else
Dim screenSaverForm As New ScreenSaverSample.fclsScreenSaver()
screenSaverForm.ShowDialog()

' Exit the application when the form is closed
Application.Exit()
End If

کدهای قسمت اول If را بعدا خواهیم نوشت اما قبل از آن به بررسی قسمت Else می‌پردازیم. اگر ویندوز هیچ پارامتری را به برنامه ارسال نکند (یعنی کاربر مستقیما'' برروی فایل exe. دابل کلیک کند) این قسمت اجرا خواهد شد. فرم اصلی برنامه را نمایش داده و هنگامی که فرم بسته شد خط آخر اجرا میشود. اما برای قسمت اول If کدهای زیر را می‌نویسیم:


If args(0).ToLower = ''/p'' Then
' Exit the application.
Application.Exit()
End If

If args(0).ToLower.Trim().Substring(0, 2) = ''/c'' Then
Dim screenSaverSetting As New ScreenSaverSample.fclsSetting()
screenSaverSetting.ShowDialog()

' Exit the application.
Application.Exit()
End If

If args(0).ToLower = ''/s'' Then
Dim screenSaverForm As New ScreenSaverSample.fclsScreenSaver()
screenSaverForm.ShowDialog()

' Exit the application when the form is closed
Application.Exit()
End If

اگر شرط args.Lenght > 0 برقرار شود بمعنای آنست که پارامتری توسط ویندوز به برنامه ارسال شده است. پس توسط سه شرط فوق پارامترها را بررسی می‌کنیم. پارامتر p/ در این مقاله مورد بررسی قرار نگرفته است. این پارامتر مربوط به ساخت قسمت پیش نمایش (Preview) است که با توجه به این که به کار با APIهای ویندوز نیاز دارد به خارج از بحث این مقاله است. برای همین به سادگی از آن گذشته و در صورت وجود آن برنامه را خاتمه می‌دهیم.

پارامتر c/ به معنای آنست که کاربر خواهان تنظیماتی برروی این Screen Saver می‌باشد. همان طور که می‌دانید برخی از Screen Saverها دارای فرمی مخصوص تنظیمات می‌باشند. شما نیز میتوانید فرمی مخصوص تنظیمات طراحی و بوسیله آن برنامه خود را کاملتر کنید. برای مثال می‌توانید در کدهای فوق بجای رسم مستطیل اشکال دیگری را به انتخاب کاربر رسم کنید. پس از ساختن فرم تنظیمات میبایست آنرا در این قسمت فراخوانی کرده و نمایش دهید. پارامتر s/ به معنای نمایش معمولی Screen Saver میباشد که مانند کد بالا فرم اصلی برنامه به نمایش درآمده است.

برنامه محافظ صفحه نمایش شما حاضر است. اما هنوز ویندوز آنرا در لیست Screen Saver های خود ثبت نکرده است!


بخش دوم - تبدیل برنامه به فرمت scr. و قرار دادن آن در لیست Screen Saverهای ویندوز
برای اینکه ویندوز برنامه شما را به عنوان یک محافظ صفحه نمایش بشناسد باید برنامه خود را با پسوند scr. در دایرکتوری سیستم ویندوز خود کپی کنید. یک پروژه جدید باز کرده و یک دکمه با عنوان Install روی فرم قرار دهید. به رویداد Click دکمه رفته و کدهای زیر را وارد کنید:


Dim fileName As String = ''ScreenSaverSample.scr''
Dim sourceFile As String = Environment.CurrentDirectory & ''\..'' & fileName
Dim destFile As String = Environment.SystemDirectory & '''' & fileName

Try
File.Copy(sourceFile, destFile, True)
Catch ex As Exception
MsgBox(ex.ToString(), MsgBoxStyle.Exclamation, Me.Text)
End Try

سه متغیر رشته‌ای تعریف کرده‌ایم که اولی نام فایل اجرایی است که پروژه قبلی تولید کرده است. متغیر بعدی آدرس فایل فوق و آخرین متغیر آدرس دایرکتوری سیستم میباشد (در ویندوزهای 32 بیتی با نام System32). در نتیجه پسوند فایل را از exe. به scr. تبدیل کرده و آنرا در دایرکتوری سیستم کپی می‌کنیم. عمل کپی نیز در ساختار Try – Catch قرار گرفته تا در صورت بروز خطا کاربر آگاه شود.

در صورتی که دستورات فوق بدون خطا اجرا شوند برنامه محافظ صفحه شما با موفقیت نصب خواهد شد. از Screen Saver خود لذت ببرید.