تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
لمحة عن Win32.SystemEvents
#1
كاتب الموضوع : مهند بيسك أوغلو

بسم الله الرحمن الرحيم
والصلاة والسلام على سيد المرسلين ....سيدنا محمد وعلى آله وصحبه أجمعين وبعد :
أولاً أعتذر من منكم على طول غيابي عن هذا المنتدى الرائع .. و أعتقد أنه لا داعي لتبرير الغياب فالسبب معروف لكم وهو: ( ظروف الحـــيــــــاة )
ثانياً : كان من المفروض أن أكتب موضوع حول WMI Events ولكن حدثت لي قصة في هذا المنتدى ألهمتني لكتابة هذا الموضوع ... أذكر أن أحد الأعضاء قد سأل حول إظهار رسالة عند إيقاف تشغيل الحاسوب , فما كان مني إلا أن يممت شطر WMI Resources و حصلت على الحدث المناسب في أقل من دقيقة ثم عدت إلى سؤال العضو الكريم وقدمت له جوابي _ متفاخراً بنفسي _ على أمل أن ينجح معه الكود ولكن للأسف لم ينجح معه... ولكني أصررت على أن أعرف الطريقة لحل المشكلة . غلغلت في الانترنيت( أي بحثت بـ غوغل) وكانت المفاجئة أن حل المشكلة بسيط للغاية وموجود في فئة اسمها Win32.SystemEvent .. عرفت حينها أنني ارتكبت خطئاً كبيراً عندما استخففت بإطار الدوت النيت و BCL.
لا أريد أن أطول القصة أكثر من ذلك ولكن أريد أن أنصحك وأقول لك : عندما تصادفك مشكلة :
1- ابحث عن حل جاهز(أقصد دوال جاهزة , أحداث جاهزة ....إلخ) في فئات الدوت نيت .فكما تعلم هذه الفئات قام بعملها فريق مكون من العديد والعديد من مبرمجي ميكروسوفت و الكثرة تغلب المهارة البرمجية.
2- إذا لم يحالفك الحظ في الفئات الجاهزة حاول أن تستخدم عقلك وتنشأ فئات من بنات أفكارك بالاستعانة بالفئات الجاهزة طبعاً . فعلى الأقل ما تزال في وضع Managed Code
3- إذا تجد طلبك في الحلين السابقين فيمكنك هنا الاستعانة ب Unmanaged Code ( API,WMI….)
نأتي الآن إلى الزبدة في هذا الموضوع . سيكون موضوع قصيراً نوعاًُ ما لأن هذه الفئة بالأساس لا تحتاج إلا قليل من الشرح ( مجرد أحداث تحتاج إلى من يلقطها)
تحوي هذه الفئة على 14 حدث كما يلي :-
1- SessionSwitch
2- SessionEnding
3- SessionEnded
4- DisplaySettingsChanging
5- DisplaySettingsChanged
6- EventsThreadShutdown
7- InstalledFontsChanged
8- PaletteChanged
9- LowMemory
10- TimeChanged
11- TimerElapsed
12- UserPreferenceChanging
13- UserPreferenceChanged
14- PowerModeChanged

نبدأ بالحدثين SessionEnding,SessionEnded وهي أحداث Session هذه الأحداث تنطلق عندما تطفئ الكومبيوتر أو عند إعادة التشغيل أو تسجيل الخروج .
في SessionEnding يمكنك إلغاء عملية إيقاف التشغيل أو إعادة التشغيل أو تسجيل الخروج ..أعتقد أننا بحاجة إلى كود و كما يقولون الكود يغني عن ألف كلمة...ولكن قبل أقدم لك الكود لا أضمن لك نجاح اقتناص هذه الأحداث و إذا نجحت في اقتناص هذه الأحداث فلا أضمن لك أن تستطيع إلغاء عملية (إيقاف التشغيل, إعادة التشغيل......) و لست أنا فقط بل حتى ميكروسوفت راجع MSDN وتحديداً حول الفئة SessionEnding ..أعتقد أن هذا الشيء مزعج للغاية.. فالمسألة أنت وحظك ...!!! إليك الكود:

كود :
Imports Microsoft.Win32
Public Class Form1
Public Sub New()
AddHandler SystemEvents.SessionEnding, AddressOf Shutdown
InitializeComponent()
End Sub
Private Sub Shutdown(ByVal sender As Object, ByVal e As SessionEndingEventArgs)
If e.Reason = SessionEndReasons.SystemShutdown Then
If MessageBox.Show("لقد تم إيقاف التشغيل هل تريد إلغاء عملية الإيقاف", "Shutdown" _
, MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
e.Cancel = True 'إلغاء عملية إيقاف التشغيل
End If
End If
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
RemoveHandler SystemEvents.SessionEnding, AddressOf Shutdown ' إزالة مقبض الحدث
End Sub
End Class
هناك شيء هام ..أعتقد أنك لاحظته في الكود وهو RemoveHandler لهذه الأحداث .. لأن هذه الأحداث ستاتيكية فيجب عليك إلغاءها من الذاكرة قبل أن يحدث تسرب في الغاز ...أقصد تسرب في الذاكرة Memory leak ( في المستقبل القريب إن شاء الله سيكون موضوعي عن هذه القضية ..أدعو لي بالتوفيق!!)
نأتي الآن إلى زوج من الأحداث , يبدو لي أنها مثيرة للاهتمام وهما UserPrefrenceChanged و UserPrefrenceChnaging
أي تغيير في تفضيلات المستخدم (تغيير خصائص:الفأرة,الكيبورد, سطح المكتب, الخلفية, أي تقريباً كل خاصية موجودة في لوحة التحكم)
سوف يؤدي إلى انطلاق ذلكما الحدثين.... أرجو من الله أن تكون الفكرة اتضحت.. ولكن مالفرق بين Changed و Changing ..يمكنك أن تعتبرها مسألة وقت Changing يصل قبل Changed ... وهذا هو مثال كامل :

كود :
Imports Microsoft.Win32
Public Class Form1
Public Sub New()
AddHandler SystemEvents.UserPreferenceChanging, AddressOf ChangingPref
AddHandler SystemEvents.UserPreferenceChanged, AddressOf ChangedPref
InitializeComponent()
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
RemoveHandler SystemEvents.UserPreferenceChanging, AddressOf ChangingPref
RemoveHandler SystemEvents.UserPreferenceChanged, AddressOf ChangedPref
End Sub
Sub ChangingPref(ByVal sender As Object, ByVal e As UserPreferenceChangingEventArgs)
MsgBox("Changing") ' لم يقع الفاس بالراس
End Sub
Sub ChangedPref(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
MsgBox("Changed") 'وقع الفاس بالراس
End Sub
End Class

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

كود :
Imports Microsoft.Win32
Public Class Form1
Public Sub New()
AddHandler SystemEvents.PowerModeChanged, AddressOf _powerModeChanged
InitializeComponent()
End Sub
Sub _powerModeChanged(ByVal sender As Object, ByVal e As PowerModeChangedEventArgs)
MsgBox(e.Mode.ToString)
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
RemoveHandler SystemEvents.PowerModeChanged, AddressOf _powerModeChanged
End Sub
End Class
والآن لم يبقى لدينا سوى بقية الأحداث ... وصدقني لا تحتاج هذه الأحداث إلا أن تعرف كيف تقتنصها هذه هي أهمها :
DisplaySettingsChanging,DisplaySettingsChanged : عند تغيير خصائص النظام
TimeChanged : عند تغيير وقت النظام
InstalledFontsChanged : عند إضافة أو إزالة خط من خطوط النظام
LowMemory : عند نقص الذاكرة
PaletteChanged : عند تشغل برنامج يستعمل لوحة ألوان غير التي حددتها لنظامك ( الصراحة لم أفهمها!!)
خاتمة:
========================================
في الواقع هذا الموضوع كان من المفترض أن أكتبه قبل هذا الوقت.. ولكن ليس باليد حيلة ...ظروف الحياة مرة أخرى ....!
أتمنى من الله أن أكون قد وفقت في هذا الموضوع....صدقني أنا قمة سعادتي إذا استفدت أنت ولو بحرف من كل هذا الموضوع....
والله الموفق.......
}}}
تم الشكر بواسطة:


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم