تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Introduction To Screen Capture
#1
السلام عليكم ورحمة الله وبركاته

مقدمة:

هذا الموضوع الهدف منه هو توضيح كيفية بناء برنامج يقوم بإلتقاط صور من شاشة الكمبيوتر باستخدام Timer و تحويلها بعد ذلك الي ملف يمكن ان يتم عرضه داخل PictureBox مثل شريط فيديو

فكرة المشروع تعتمد علي إعطاء المستحدم إمكانية تحديد مكان التصوير علي شاشة الكمبيوتر عن طريق رسم مستطيل يستطيع المستخدم تحريكه وضبط أبعاده كما يحلو له ثم بعد ذلك يبدأ البرنامج و باستخدام Timer في التقاط صور بشكل مستمر للمكان الذي قام مستخدم البرنامج بتحديده علي سطح جهاز الكمبيوتر حيث سكون هناك إمكانية لحفظ الصور في ملف او استعراض هذا الملف داخل PictureBox مثل شريط فيديو

لذلك سوف يتم تنفيذ هذا المشروع علي مرحلتين كالأتي

1- كتابة بعض الكلاسات التي سوف نستخدمها في رسم المستطيل و تحريكه علي شاشة الكمبيوتر
2- كتابة الطرق و الدوال التي سيتم استخدامها في تصوير شاشة الكمبيوتر و حفظ الصور في ملف واحد ثم عرض الصور مثل شريط فيديو

رسم و تحريك مستطيل علي شاشة الكمبيوتر:

الأسلوب المستخدم هنا هو نفس الأسلوب الذي يتم استخدامه في رسم و تحريك الفورم العادي علي شاشة الكمبيوتر وكما هو معلوم للجميع الفورم العادي به ثمانية مناطق يتم من خلالها تغيير أبعاد الفورم و هناك منطقة واحدة لتحريك الفورم

الكلاسات و Interface و Enum المستخدمة لرسم و تحريك المستطيل هي كالأتي:

1- IBeltGlyph
يمثل Interface المسئول عن تعريف و رسم اي مستطيل يتم رسمه علي الفورم و هو الأساس لبعض الكلاسات الخاصة بتحريك ورسم المستطيل


كود :
Public Interface IBeltGlyph

   Property Bounds As Rectangle
   Property Visible As Boolean
   ReadOnly Property GlyphCursor As Cursor
   ReadOnly Property GlyphPosition As BeltGlyphHitPosition
   Function HitBeltGlyph(pt As Point) As Boolean
   Sub PaintBeltGlyph(g As Graphics, glyphBackColor As Color, glyphBorderColor As Color, glyphGradientColor As Color)

End Interface ' IBeltGlyph

2- IBeltBehaviour
يمثل Interface المسئول عن كل العمليات الخاصة بتحريك و رسم المستطيل و به الحسابات الخاصة بحساب مكان المستطيل علي شاشة الكمبيوتر حتي يتمكن مستخدم البرنامج من تحريك المستطيل و تغيير أبعاده


كود :
Public Interface IBeltBehaviour

   Property BeltBackColor As Color
   Property BeltBorderColor As Color
   Property BeltGradientColor As Color
   Property BeltBounds As Rectangle
   Property BeltDisplayBounds As Rectangle
   Property BetlText As String

   ReadOnly Property BeltDefaultLocation As Point
   ReadOnly Property BeltDefaultSize As Size
   ReadOnly Property BeltMinimumSize As Size
   ReadOnly Property BeltMinimumThickness As Single
   ReadOnly Property BeltMaximumThickness As Single

   Function GetBeltScreenBounds() As Rectangle
   Function GetBeltWorkingBounds() As Rectangle

   Function IsBeltOnMaximum(rect As Rectangle) As Boolean
   Function IsBeltOnMinimum(rect As Rectangle) As Boolean
   Function TranslateBelt(pt As Point, rect As Rectangle) As Rectangle
   Function BeltToClient(rect As Rectangle) As Rectangle
   Function BeltToClient(rect As Rectangle, minWidth As Single, maxWidth As Single) As Rectangle

   Function BeltToScreen(rect As Rectangle, beltWidth As Single) As Rectangle
   Function BeltToScreen(rect As Rectangle) As Rectangle
   Function GetBeltDeskTopPosition(x As Integer, y As Integer, w As Integer, h As Integer) As Rectangle
 
   Sub DisoposeBeltButtons()
   Sub UpdateBeltButtons()
   Sub AttachBeltButtons()

   Sub ReSizeDragBelt(position As BeltGlyphHitPosition, pt As Point)
   Sub ReSizeDragBelt(position As BeltGlyphHitPosition, dx As Integer, dy As Integer)
   Sub UpdateBeltGlyph(rect As Rectangle)
   Sub InitializeBeltWindow()
   Sub OnBeltLocationChanged(beltLocation As Point)
   Sub OnBeltSizeChanged(beltSize As Point)

   Sub BeltCloseButtonClick(sender As Object, e As EventArgs)
   Sub BeltCaptureButtonClick(sender As Object, e As EventArgs)
   Sub BeltStopCaptureButtonClick(sender As Object, e As EventArgs)
   Sub BeltMouseMove(e As MouseEventArgs)
   Sub BeltMouseDown(e As MouseEventArgs)
   Sub BeltMouseUp(e As MouseEventArgs)
   Sub BeltPaint(e As PaintEventArgs)

End Interface

3- BeltGlyphHitPosition
يمثل Enum الذي يحدد مجموعة من المناطق سيتم الضغط عليها بالماوس

4- BeltLocationChangedEventArgs
يمثل الكلاس الي سيخبرنا متي يتغير مكان المستطيل علي الفورم

5- BeltSizeChangedEventArgs
يمثل الكلاس الي سيخبرنا متي تتغير ابعاد المستطيل علي الفورم

6- SizingGlyph
يمثل الكلاس المسئول عن رسم المستطيلات التي ستستخدم لتغيير أبعاد المستطيل علي شاشة الكمبيوتر

7- ClientGlyph
يمثل الكلاس المسئول عن رسم المنطقة الخاصة بمستخدم البرنامج علي شاشة الكمبيوتر

8- CaptionGlyph
يمثل الكلاس المسئول عن رسم و تحريك المستطيل علي شاشة الكمبيوتر


9- GhostWindow
يمثل الفورم الذي تحدث عليه عمليات الرسم الخاصة بالمستطيل الي سيتمكن مستخدم البرنامج من تحريكه و تغيير ابعاده كيفما شاء لتحديد  المكان الذي يريد أن يلتقط صورا له من علي سطح شاشة الكمبيوتر

10- BeltButton
هو باتون له شكل مختلف قليلا عن الباتون العادي الموجود في الفيجوال استوديو حيث سنستخدمه لإغلاق الفورم او بدء التصوير من علي سطح شاشة الكمبيوتر


عموما و نظرا لحجم الكود المكتوب سيصعب توضيح و شرح كل شئ لكن علي المهتمين بالأمر أن يسألوا كيفما شاءوا و ساوضح لهم لاحقا بالرد علي استفساراتهم

و بهذا تنتهي المرحلة الأولي من المشروع الذي نريد كتابته

أخي الفاضل TheGhost عذرا للتأخير في كتابة الكود لك و لكن كان لدي ظروف طارئة منعتني من أن أضع الكود لك قبل هذا اليوم تقبل تحياتي

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

الكود الخاص ب المرحلة الأولي موجود ب المرفقات

تقبلوا تحياتي و كل عام و أنتم بخير



الملفات المرفقة
.rar   Test_GhostWindow.rar (الحجم : 126.01 ك ب / التحميلات : 28)
الرد }}}}
تم الشكر بواسطة: abulayth , الشاكي لله , أبو عمر , سعود , ربيع
#2
السلام عليكم ورحمة الله و بركاته

في الجزء الأول تم إعطاء مستخدم البرنامج إمكانية تحريك المستطيل و تغيير أبعاده لكي يستطيع تحديد الجزء الذي يريد تصويره من علي سطح الشاشة

في هذه المشاركة سأوضح كيفية أخذ صورة واحدة فقط لجزء معين علي شاشة الكمبيوتر وحفظها في Debug Folder الخاص بالمشروع

ولتنفيذ ذلك نحتاج  الي تعديل الكود قليلا في الكلاس ClientGlyph حتي نتخلص من عمليات الرسم التي تحدث في هذا الكلاس

الكود الخاص بالكلاس ClientGlyph يجب أن يكون كالتالي:

كود :
Public Class ClientGlyph
   Implements IBeltGlyph

#Region " Field "

   Private isVisible As Boolean = True
   Private rect As Rectangle = New Rectangle(0, 0, 0, 0)

#End Region

#Region " Property "


   Public Property Bounds As Rectangle Implements IBeltGlyph.Bounds
       Get
           Return Me.rect
       End Get
       Set(value As Rectangle)
           Me.rect = value
       End Set
   End Property

   Public ReadOnly Property GlyphCursor As Cursor Implements IBeltGlyph.GlyphCursor
       Get
           Return Cursors.Arrow
       End Get
   End Property

   Public ReadOnly Property GlyphPosition As BeltGlyphHitPosition Implements IBeltGlyph.GlyphPosition
       Get
           Return BeltGlyphHitPosition.BeltClient
       End Get
   End Property

   Public Property Visible As Boolean Implements IBeltGlyph.Visible
       Get
           Return Me.isVisible
       End Get
       Set(value As Boolean)
           Me.isVisible = value
       End Set
   End Property

#End Region

#Region " Method "

   Public Function HitBeltGlyph(pt As Point) As Boolean Implements IBeltGlyph.HitBeltGlyph
       Return Me.isVisible AndAlso Me.Bounds.Contains(pt)
   End Function

   Public Sub PaintBeltGlyph(g As Graphics, glyphBackColor As Color, glyphBorderColor As Color, glyphGradientColor As Color) Implements IBeltGlyph.PaintBeltGlyph
       ' Do not paint anything to keep the clientglyph area clear during screen capture
   End Sub

#End Region

End Class


الأن و في الفورم GhostWindow لنكتب الكود الذي ياخذ صورة واحدة لجزء من سطح المكتب و ذلك عند الضغط علي الباتون Capture لذلك سنقوم بالتعديل قليلا علي في الكود التالي

بالتاكيد يمكنكم التعديل غلي كود حفظ الصورة لإعطاء مستخدم البرنامج امكانية حفظ الصورة في المكان الذي يريده

كود :
  Private Sub BeltCaptureButtonClick(sender As Object, e As EventArgs) Implements IBeltBehaviour.BeltCaptureButtonClick
       'Me.clientGlyph.Visible = False
       'Me.Invalidate(Me.clientGlyph.Bounds)
       System.Threading.Thread.Sleep(500)
       Dim g As Graphics = CType(Nothing, Graphics)
       Try
           Dim captured As Bitmap = New Bitmap(Me.clientGlyph.Bounds.Width, Me.clientGlyph.Bounds.Height)
           g = Graphics.FromImage(captured)
           g.CopyFromScreen(Me.clientGlyph.Bounds.X, Me.clientGlyph.Bounds.Y, 0, 0, captured.Size)
           Dim fileName As String = ".\captured .jpeg"
           captured.Save(fileName)
       Catch ex As Exception
       Finally
           g.Dispose()
       End Try
   End Sub
الرد }}}}
تم الشكر بواسطة: ربيع
#3
راجع اللينك التالي لمعرفة كيفية دمج مجموعة من الصور في صورة واحدة أو استخلاص الصور منها

Create, Save Tiff Image & Extract Images From TIFF Image

الأن يمكن اضافة تايمر الي المشروع و اخذ صورة لسطح كل فترة زمنية ثابتة و حفظها في مصفوفة Array ثم حفظ كل الصور في صورة واحدة و اعتقد ان هذا لن يكون امرا صعبا علي المهتمين بالموضوع
الرد }}}}
تم الشكر بواسطة: ربيع


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Detect Display Screen DPI silverlight 3 236 11-06-16, 12:07 PM
آخر رد: Sajad
  Capture Mouse Position within Control Coordinates silverlight 0 224 11-12-15, 10:30 PM
آخر رد: silverlight
  معلومة ::: How to resize Windows form to fit Windows screen ::: RaggiTech 0 413 06-10-12, 09:53 PM
آخر رد: RaggiTech
  درس- كيفية عمل شاشة البدء splash Screen RaggiTech 0 1,135 05-10-12, 10:36 AM
آخر رد: RaggiTech
  مثال Screen Server RaggiTech 0 354 05-10-12, 01:13 AM
آخر رد: RaggiTech
  إعمل Splash Screen في دقيقة! RaggiTech 0 418 02-10-12, 01:01 AM
آخر رد: RaggiTech

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


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