الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الحصول على صورة سطح المكتب بمميزات إضافية

بدأه رغيد الطيب في 20 يناير 2010 · 3 رد · 2,366 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحيم الرحيم

لصورة سطح شعبية كبيرة فكثيرا هي البرامج التي يتطلب فيها الحصول على لقطة لسطح المكتب، مثل البرامج الرسومية او برامج مراقبة الشاشات و حتى الترفيهية منها.

وللحصول على صورة لسطح المكتب يوجد العديد من الطرق المعقدة و التي تستخدم الـ API او حافظة الوينذوز Clipboard كوسيط تخزيني قبل جلب الصورة الى برنامجنا

في هذا الدرس البسيط سأعرض طريقة بسيطة في فئة بسيطة تستخدم كود دوت نت نقي (بدون API او خلافه) ... للحصول على صورة لسطح المكتب .... مع بعض المزايا الاضافية.

تعتمد فئتنا البسيطة على الدالة CopyFromScreen من الكائن Graphics حيث تقوم بنسخ محتويات شاشة الكمبيوتر كاملة الى كائن جرافكس نستخدمه بعدها لإنشاء صورة لسطح المكتب.

وكود الفئة الجديدة rtaDesktop هو كالتالي :

Public Class rtaDesktop

    Public Shared Image As Image
    Public Shared Bounds As Rectangle

    Shared Function GetDesktopImage(Optional ByVal Width As Integer = 0, Optional ByVal Height As Integer = 0, Optional ByVal ShowCursor As Boolean = True) As Image
        Dim W As Integer = Screen.PrimaryScreen.Bounds.Width
        Dim H As Integer = Screen.PrimaryScreen.Bounds.Height

        Dim DesktopBitmap As New Bitmap(W, H)
        Dim g As Graphics = Graphics.FromImage(DesktopBitmap)

        g.CopyFromScreen(0, 0, 0, 0, New Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height), CopyPixelOperation.SourceCopy)
        If ShowCursor Then Cursors.Default.Draw(g, New Rectangle(Cursor.Position, New Size(32, 32)))
        g.Dispose()

        If Width = 0 And Height = 0 Then
            Image = DesktopBitmap
            Return DesktopBitmap
        Else
            Dim ScaledBitmap As Image = DesktopBitmap.GetThumbnailImage(Width, Height, Nothing, IntPtr.Zero)
            DesktopBitmap.Dispose()
            Image = ScaledBitmap
            Return ScaledBitmap
        End If

    End Function

End Class

تحتوي الفئة rtaDesktop على دالة واحدة من النوع Shared (Static) وبالتالي فيمكنك استخدامها بدون إنشاء كائن لها (اي سندها اى متغير) .. بالشكل التالي :

Dim Img As Image = rtaDesktop.GetDesktopImage()

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

مؤشر الماوس

لكن توجد حالات لانريد ان يظهر فيها مؤشر الماوس على الصورة التي سنلتقطها لسطح المكتب.

في هذه الحالة يمكنك بسهولة تغيير السطر السابق الى التالي :

Dim Img As Image = rtaDesktop.GetDesktopImage(ShowCursor:=False)

هذا الكود سوف يجلب لنا صورة سطح المكتب السابقة ولكن دون مؤشر الفارة.

حيث False لإخفاء المؤشر و True لإظهاره.

ابعاد صورة سطح المكتب

في بعض الاحيان تحتاج الى اخذ صورة صغيرة لسطح المكتب !! ... تخيل معي انك تريد ان تقوم بارسال نسخة مصغرة من سطح المكتب الى كمبيوتر آخر في الشبكة لنقل صورة بعرض 300 * 200 .... طبعا من الممكن ان تقوم بأخذ صورة عادية كما في الطريقة السابقة وارسالها الى الكمبيوتر الآخر ثم تقوم هناك بعرضها داخل PictureBox صغير بحيث يقوم بتصغيير حجمها ليناسبه!

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

وللتخيل فظاعة المشكلة ينبغي ان تعرف ان الصورة بحجم كامل للشاشة في جهازي مثلا كان حجمها 1.4 ميجا بايت اي تقريبا ميجا ونصف بينما نفس الصورة بحجم 300 في 200 .... فقد وصل حجمها الى 111 كيلو ... اي ان حجم الاخيرة حوالي 8% من حجم الصورة الكاملة ... وبكلام آخر ان حجم الصورة الكاملة يزيد عن حجم صورتك الصغيرة بإثنا عشر مرة.

لهذا اذا اغفلت شيئا كهذا سيعني ان صورة واحدة ترسلها الى الشبكة يمكن لغيرك ان يرسل عشر صور بنفس التكلفة تبعك.

المهم في موضوعنا هذا انك يمكن ان تحصل على صورة بالابعاد التي تريدها لسطح المكتب بإستخدام فئتنا العزيزة كما يلي :

        Dim Img As Image = rtaDesktop.GetDesktopImage(300,400,True)

في الكود السابق ستحصل على صورة بابعاد 300 في 200 وتحتوي على مؤشر الماوس.

ارجوا ان تستفيد من هذه الفئة البسيطة

تحياتي

السلام عليكم ورحمة الله وبركاته

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#2

بسم الله الرحمن الرحيم

بارك الله فيك على هذا الموضوع القيم

راودتني فكرة وهي تطوير المشروع لجعله برنامج لعمل فيديو تعليمي

والمشكلة هي كيفية تجميع الصور المسجلة وتحويلها لفيديو مع الصوت

اللهم لا سهل الا ماجعلته سهلا، وانت تجعل الصعب ان شئت سهلا

83_45a7168be2ddb.jpg

#3

أحسن الله اليك

لا خيــــــــــر في كاتــــــــــم العلــــــــــم

سأل الممكن المستحيل ، قال أين تسكن ، فال أسكن في عقول العاجزين

#4

شكرااااااااااااا الله يعطيك العافيه وسلامه

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