منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : التأكد ان المستخدم اعاد تشغيل الجهاز
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله
اريد ان اتاكد ان المستخدم قام باعادة تشغيل الكمبيوتر
وجزاكم الله خيرا
السلام عليكم...

يستعمل النظام Windows ما يسمى بجدول الذرات العام (Global Atom Table) لتخزين البيانات في الذاكرة كواحد من طرق تبادل البيانات بين التطبيقات (DDE). و لكن نستطيع أن نستفيد من ذلك في إنجاز المطلوب في السؤال.

يمكنك استعمال دوال API لوضع نص (String) في ذلك الجدول، و سيبقى ذلك النص هناك إلى أن يتم إيقاف أو إعادة تشغيل الحاسوب (أو طبعاً تزيله أنت باستعمال الدالة المخصصة لذلك).

بعد وضع النص يمكنك اختبار ما إذا مازال موجوداً في الجدول أم لا.

1. ضع التصريحات التالية في بداية الكود - التصريح الأخير GlobalDeleteAtom لا تحتاجه إذا لم تكن تريد حذف النص بالكود:

كود :
Private Declare Function GlobalAddAtom Lib "kernel32.dll" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer
Private Declare Function GlobalGetAtomName Lib "kernel32.dll" Alias "GlobalGetAtomNameA" (ByVal nAtom As Integer, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GlobalFindAtom Lib "kernel32.dll" Alias "GlobalFindAtomA" (ByVal lpString As String) As Integer
' Private Declare Function GlobalDeleteAtom Lib "kernel32.dll" (ByVal nAtom As Integer) As Integer

2. لإضافة نص إلى الجدول:

كود :
GlobalAddAtom("computer not restarted")

3. لاختبار ما إذا كان النص مازال موجوداً في الجدول (لم تتم إعادة التشغيل):

كود :
Dim s As String
        Dim lRet As Integer
        Const MAX_ATOM = 255

        iAtom = GlobalFindAtom("computer not restarted")

        s = Space$(MAX_ATOM)
        lRet = GlobalGetAtomName(iAtom, s, Len(s))
        s = s.Substring(0, lRet)
        If s = "computer not restarted" Then
            MsgBox("لم تتم إعادة تشغيل الحاسوب")
        Else
            MsgBox("كلو تمام")
        End If

* طبعاً بدل النص "computer not restarted" يمكنك أن تضع أي نص آخر بشرط أن لا يتجاوز طوله 255 رمزاً. و يستحسن أن يكون نصاً غريباً من المستبعد جداً أن يستخدمه برنامج آخر.

نرجو الاستفادة و السلام.
السلام عليكم

ما شاء الله اخى ناجي افتقدنا مثل هذه الافكار من زمن

معلش لى بعض الاسئلة لو تفضلت او تفضل احد الاخوة بالاجابة عليها حتي اتعلم

1 - لماذا قمت بعمل ثابت Const يحمل عدد الاحرف الـ 255 لماذا لم تمرر له العدد مباشر فى الدالة

2 - ما فائدة علامة الـ $

3 - هل يستطيع احد مراقبة برنامجي ويعرف القيم التى اخذنها ويقوم بحذفها

وجزاك الله خيرا
السلام عليكم...

إجابة 1 و 2: العتب على العادة (التعود) ! فمعظم خبرتي البرمجية اكتسبتها من خلال العمل على VB6.

= وجود علامة الدولار في نهاية اسم الدالة يعني أنها ستعيد String و ليس Variant (فيكون الأمر أسرع قليلاً و أقل استهلاكاً للذاكرة). و رغم أن VB.NET مازالت تدعم استعمال العلامة $ مع بعض الدوال (مثل الدالة $Space) فإن ذلك غير ضروري (حتى إذا حذفت العلامة فالدالة ستعيد String).

= بالطبع يمكنك تمرير العدد مياشرة إلى الدالة، لكنني شخصياً لا أحب استعمال ما يسمى بالأعداد السحرية (Magic Numbers) و هي الأعداد التي لا تعرف معناها إلا إذا سألت عنها! أما إذا عرفتها كثوابت فغالباً اسم الثابت يدل على المعنى أو الغرض المستعملة من أجله القيمة - ربما هذا ليس مهماً في هذا المثال القصير، لكنه يصبح مساعداً جداً عند العمل في برامج كبيرة ذات أكواد متعددة، حيث يصبح تذكر أسماء الثوابت أسهل من تذكر الأعداد، فمثلاً إذا استعملت الدالة ShowWindow لعرض نافذة فإني أستطيع أن أتذكر بسهولة الثابت SW_MAXIMIZE لعرضها مكبرة مع أني لا أتذكر قيمته.

إجابة 3: الجدول Global Atom Table هو جدول عام يمكن لكل البرامج الوصول إليه. لكن لا يوجد في دوال API دالة لمسح محتوياته أو قراءة كافة محتوياته. فالدوال المتوفرة للتعامل مع هذا الجدول هي:

= GlobalAddAtom لإضافة نص إلى الجدول و الحصول على رقم تعريف ذلك النص.
= GlobalFindAtom للبحث عن نص في الجدول و الحصول على رقم تعريف ذلك النص (أو صفر في حالة عدم وجود النص).
= GlobalGetAtomName للحصول على نص بمعلومية رقم تعريفه.
= GlobalDeleteAtom لحذف نص من الجدول بمعلومية رقم تعريفه.

و لا أعلم شيئاً غير ذلك حول هذا الجدول.

نرجو الاستفادة و السلام.
السلام عليكم ورحمة الله
جزاك الله خيرا اخى ناجى
توضيح وشرح رائع للغاية
زادك الله علما ونفع بك
وجعله فى موازين حسناتك

لى سؤال اخر
الدالة GlobalGetAtomName تعود بـ Len
لماذا تخزنها فى Integer

اليس هذا ربما يحدث خطاء
السلام عليكم...

آه المعذرة! يجب تعديل تصريح الدالة GlobalGetAtomName (في جملة Declare) بحيث يصبح نوع الدالة Integer و كذلك نوع البارامتر nSize (التصريحات أخذتها من برنامج قديم مكتوب بـ VB6 حيث Long تعني Integer في VB.NET).

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

الدالة GlobalDeleteAtom تحتاج إلى رقم تعريف النص في الجدول. إذا خزنت هذا الرقم عند إضافة النص (باستخدام الدالة GlobalAddAtom التي تعيد رقم التعريف) فبإمكانك طبعاً استعمال ذلك الرقم المخزن.

أما إذا لم يكن لديك رقم التعريف و لديك النص فإننا نستعمل الدالة GlobalFindAtom للبحث عن النص في الجدول و الحصول على رقم تعريفه، و الذي بدوره نمرره للدالة GlobalDeleteAtom لحذفه:
كود :
Dim iAtom As Integer

iAtom = GlobalFindAtom("computer not restarted")
GlobalDeleteAtom(iAtom)

نرجو الاستفادة و السلام.
السلام عليكم ورحمة الله
جزاك الله خيرا اخي ناجي
وجعله الله في موازين حسناتك
وبارك لك في علمك
الصفحات : 1 2