شاطر
اذهب الى الأسفل
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

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

في الثلاثاء أكتوبر 09, 2012 9:37 am
بسم الله الرحيم الرحيم


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


وللحصول على صورة لسطح المكتب يوجد العديد من الطرق المعقدة و التي تستخدم الـ 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 وتحتوي على مؤشر الماوس.


ارجوا ان تستفيد من هذه الفئة البسيطة
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى