- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
الحصول على صورة سطح المكتب
الثلاثاء أكتوبر 09, 2012 9:37 am
بسم الله الرحيم الرحيم
لصورة سطح شعبية كبيرة فكثيرا هي البرامج التي يتطلب فيها الحصول على لقطة لسطح المكتب، مثل البرامج الرسومية او برامج مراقبة الشاشات و حتى الترفيهية منها.
وللحصول على صورة لسطح المكتب يوجد العديد من الطرق المعقدة و التي تستخدم الـ API او حافظة الوينذوز Clipboard كوسيط تخزيني قبل جلب الصورة الى برنامجنا
في هذا الدرس البسيط سأعرض طريقة بسيطة في فئة بسيطة تستخدم كود دوت نت نقي (بدون API او خلافه) ... للحصول على صورة لسطح المكتب .... مع بعض المزايا الاضافية.
تعتمد فئتنا البسيطة على الدالة CopyFromScreen من الكائن Graphics حيث تقوم بنسخ محتويات شاشة الكمبيوتر كاملة الى كائن جرافكس نستخدمه بعدها لإنشاء صورة لسطح المكتب.
وكود الفئة الجديدة rtaDesktop هو كالتالي :
مؤشر الماوس
لكن توجد حالات لانريد ان يظهر فيها مؤشر الماوس على الصورة التي سنلتقطها لسطح المكتب.
في هذه الحالة يمكنك بسهولة تغيير السطر السابق الى التالي :
حيث False لإخفاء المؤشر و True لإظهاره.
ابعاد صورة سطح المكتب
في بعض الاحيان تحتاج الى اخذ صورة صغيرة لسطح المكتب !! ... تخيل معي انك تريد ان تقوم بارسال نسخة مصغرة من سطح المكتب الى كمبيوتر آخر في الشبكة لنقل صورة بعرض 300 * 200 .... طبعا من الممكن ان تقوم بأخذ صورة عادية كما في الطريقة السابقة وارسالها الى الكمبيوتر الآخر ثم تقوم هناك بعرضها داخل PictureBox صغير بحيث يقوم بتصغيير حجمها ليناسبه!
غير ان فعلك لهذا يعتبر خطأ كبير جدا ... لأنك غامرت بارسال بيانات كبيرة تؤثر سلبا على سرعة برنامجك وعلى اداء الشبكة ككل في حين انك لا تريد سوى صورة صغيرة لجزء معين هو 300 في 200 مثلا.
وللتخيل فظاعة المشكلة ينبغي ان تعرف ان الصورة بحجم كامل للشاشة في جهازي مثلا كان حجمها 1.4 ميجا بايت اي تقريبا ميجا ونصف بينما نفس الصورة بحجم 300 في 200 .... فقد وصل حجمها الى 111 كيلو ... اي ان حجم الاخيرة حوالي 8% من حجم الصورة الكاملة ... وبكلام آخر ان حجم الصورة الكاملة يزيد عن حجم صورتك الصغيرة بإثنا عشر مرة.
لهذا اذا اغفلت شيئا كهذا سيعني ان صورة واحدة ترسلها الى الشبكة يمكن لغيرك ان يرسل عشر صور بنفس التكلفة تبعك.
المهم في موضوعنا هذا انك يمكن ان تحصل على صورة بالابعاد التي تريدها لسطح المكتب بإستخدام فئتنا العزيزة كما يلي :
ارجوا ان تستفيد من هذه الفئة البسيطة
لصورة سطح شعبية كبيرة فكثيرا هي البرامج التي يتطلب فيها الحصول على لقطة لسطح المكتب، مثل البرامج الرسومية او برامج مراقبة الشاشات و حتى الترفيهية منها.
وللحصول على صورة لسطح المكتب يوجد العديد من الطرق المعقدة و التي تستخدم الـ 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
- الكود:
Dim Img As Image = rtaDesktop.GetDesktopImage()
مؤشر الماوس
لكن توجد حالات لانريد ان يظهر فيها مؤشر الماوس على الصورة التي سنلتقطها لسطح المكتب.
في هذه الحالة يمكنك بسهولة تغيير السطر السابق الى التالي :
- الكود:
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)
ارجوا ان تستفيد من هذه الفئة البسيطة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى