Results 1 to 3 of 3

Thread: Multi-Monitor ScreenShots

  1. #1

    Thread Starter
    New Member
    Join Date
    Mar 2024
    Posts
    3

    Multi-Monitor ScreenShots

    [Multi Screen Capture Program by Smitty][1]


    [1]: https://i.stack.imgur.com/A5GY7.png

    The Form has
    CheckBox2 - Checkbox - Button Style - Anchor = Top, Left
    CB1 - ComboBox - Font size = 20 - Text = 1 - Anchor = Top, Left
    PB1 - PictureBox - SizeMode = StretchImage - Anchor = Top, Right, Bottom, Left

    This is the module1.vb code

    Code:
    Imports System.Drawing.Drawing2D
        Imports System.Drawing.Imaging
        Imports System.Media
        Imports System.Threading
        Imports System.Management
        Imports System.Runtime.InteropServices
        
        Module Mod1
            Dim x As Integer = Screen.AllScreens.Count
            Public mon(x) As ScreenSpecs
            <DllImport("gdi32.dll")>
            Public Function GetDeviceCaps(ByVal hDC As IntPtr, ByVal nIndex As Integer) As Integer
            End Function
        
            <DllImport("gdi32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)>
            Public Function CreateDC(<MarshalAs(UnmanagedType.LPStr)> lpszDriver As String,
                  <MarshalAs(UnmanagedType.LPStr)> lpszDevice As String,
                  <MarshalAs(UnmanagedType.LPStr)> lpszOutput As String,
                  lpInitData As IntPtr) As IntPtr
            End Function
            Public Function BeforeLast(value As String, a As String) As String
                If value = Nothing Then
                    Return value
                    Exit Function
                End If
                Dim posA As Integer = value.LastIndexOf(a)
                If posA = -1 Then Return ""
                Return value.Substring(0, posA)
            End Function
            Public Function BeforeFirst(value As String, a As String) As String
                If value = Nothing Then
                    Return value
                    Exit Function
                End If
                Dim posA As Integer = value.IndexOf(a)
                If posA = -1 Then Return ""
                Return value.Substring(0, posA)
            End Function
            Public Function AfterFirst(value As String, a As String) As String
                If value = Nothing Then
                    Return value
                    Exit Function
                End If
                Dim posA As Integer = value.IndexOf(a)
                If posA = -1 Then Return ""
                Dim adjustedPosA As Integer = posA + a.Length
                If adjustedPosA >= value.Length Then Return ""
                Return value.Substring(adjustedPosA)
            End Function
            Public Function AfterLast(value As String, a As String) As String
                If value = Nothing Then
                    Return value
                    Exit Function
                End If
                Dim posA As Integer = value.LastIndexOf(a)
                If posA = -1 Then Return ""
                Dim adjustedPosA As Integer = posA + a.Length
                If adjustedPosA >= value.Length Then Return ""
                Return value.Substring(adjustedPosA)
            End Function
        
            Public Function GrabScreen(Index As Integer) As Bitmap
                Dim MonWidth As Integer = mon(Index).Width
                Dim MonHeight As Integer
                If Form1.CheckBox2.Checked Then
                    MonHeight = mon(Index).Height
                Else
                    MonHeight = mon(Index).HeightNtb
                End If
                Dim screenSize As Size = New Size(MonWidth, MonHeight)
                Dim screenGrab As New Bitmap(MonWidth, MonHeight)
                Dim g As Graphics = Graphics.FromImage(screenGrab)
                g.CopyFromScreen(New Point(mon(Index).XStart, mon(Index).YStart), New Point(0, 0), screenSize)
                Return screenGrab
            End Function
        
            Public Function GetScalleFactor(index As Integer) As Double
                Dim desktop As IntPtr = CreateDC(Screen.AllScreens(index).DeviceName, Nothing, Nothing, IntPtr.Zero)
                Return GetDeviceCaps(desktop, 118) / GetDeviceCaps(desktop, 8)
            End Function
        
        End Module
    This is the ScreenSpec.vb Class I created

    Code:
    Public Class ScreenSpecs
            Private BPPValue As Integer
            Private IndexValue As Integer
            Private NameValue As String
            Private WidthValue As Integer
            Private HeightValue As Integer
            Private HeightNtbValue As Integer
            Private ScaleValue As Double
            Private XStartValue As Integer
            Private YStartValue As Integer
            Public Property BPP() As Integer
                Get
                    ' Gets the property value.
                    Return BPPValue
                End Get
                Set(ByVal Value As Integer)
                    ' Sets the property value.
                    BPPValue = Value
                End Set
            End Property
            Public Property Index() As Integer
                Get
                    ' Gets the property value.
                    Return IndexValue
                End Get
                Set(ByVal Value As Integer)
                    ' Sets the property value.
                    IndexValue = Value
                End Set
            End Property
            Public Property Name() As String
                Get
                    ' Gets the property value.
                    Return NameValue
                End Get
                Set(ByVal Value As String)
                    ' Sets the property value.
                    NameValue = Value
                End Set
            End Property
            Public Property Width() As String
                Get
                    ' Gets the property value.
                    Return WidthValue
                End Get
                Set(ByVal Value As String)
                    ' Sets the property value.
                    WidthValue = Value
                End Set
            End Property
            Public Property Height() As String
                Get
                    ' Gets the property value.
                    Return HeightValue
                End Get
                Set(ByVal Value As String)
                    ' Sets the property value.
                    HeightValue = Value
                End Set
            End Property
            Public Property HeightNtb() As String
                Get
                    ' Gets the property value.
                    Return HeightNtbValue
                End Get
                Set(ByVal Value As String)
                    ' Sets the property value.
                    HeightNtbValue = Value
                End Set
            End Property
            Public Property Scale() As Double
                Get
                    ' Gets the property value.
                    Return ScaleValue
                End Get
                Set(ByVal Value As Double)
                    ' Sets the property value.
                    ScaleValue = Value
                End Set
            End Property
            Public Property XStart() As String
                Get
                    ' Gets the property value.
                    Return XStartValue
                End Get
                Set(ByVal Value As String)
                    ' Sets the property value.
                    XStartValue = Value
                End Set
            End Property
            Public Property YStart() As String
                Get
                    ' Gets the property value.
                    Return YStartValue
                End Get
                Set(ByVal Value As String)
                    ' Sets the property value.
                    YStartValue = Value
                End Set
            End Property
        End Class
    This is the Form1.vb code

    Code:
    Imports System.Drawing.Imaging
        Imports System.Runtime.InteropServices
        Imports System.Threading
        
        Public Class Form1
        
            Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
                On Error Resume Next
                CB1.Items.Clear()
                Dim x As Integer
                Dim MonH As Integer
                Dim MonHtb As Integer
                Dim MonW As Integer
                For x = 0 To (UBound(Screen.AllScreens))
                    mon(x) = New ScreenSpecs()
                    mon(x).Index = x
                    mon(x).Name = Screen.AllScreens(x).DeviceName.ToString
                    mon(x).BPP = Screen.AllScreens(x).BitsPerPixel
                    MonH = Screen.AllScreens(x).Bounds.Size.Height.ToString
                    MonHtb = Screen.AllScreens(x).WorkingArea.Size.Height.ToString
                    MonW = Screen.AllScreens(x).Bounds.Size.Width.ToString
                    mon(x).Scale = GetScalleFactor(x)
                    mon(x).Height = (MonH * mon(x).Scale)
                    mon(x).HeightNtb = (MonHtb * mon(x).Scale)
                    mon(x).Width = (MonW * mon(x).Scale)
                    mon(x).XStart = Screen.AllScreens(x).Bounds.Location.X.ToString
                    mon(x).YStart = Screen.AllScreens(x).Bounds.Location.Y.ToString
                    CB1.Items.Add((x + 1))
                Next
            End Sub
        
            Private Sub PB1_Click(sender As Object, e As EventArgs) Handles PB1.Click
                PB1.Image = GrabScreen((Int(CB1.Text) - 1))
            End Sub
        
            Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
                If CheckBox2.Checked = False Then
                    CheckBox2.Text = "No Taskbar"
                    CheckBox2.BackColor = Color.Pink
                Else
                    CheckBox2.Text = "Show Taskbar"
                    CheckBox2.BackColor = Color.LightGreen
                End If
            End Sub
        
            Private Sub CB1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CB1.SelectedIndexChanged
                Dim MonSpec As String = ""
                Dim x As Integer = sender.SelectedIndex
                Me.Text = "Monitor Number " & mon(x).Index & " - BitsPerPixel = " & mon(x).BPP & " - Scaling Factor = " & mon(x).Scale & " - Width = " & mon(x).Width & " - Height = " & mon(x).Height & " - X-Start = " & mon(x).XStart & " - Y-Start = " & mon(x).YStart
            End Sub
        End Class
    When program starts it will find all monitors and list them in ComboBox.
    Set ComboBox to monitor number you want and single-click PictureBox.
    Your selected monitor will be captured in the PictureBox. The CheckBox is used as a (Show Task Bar/Hide Task Bar). Also as you switch ComboBox the selected monitors specs will show in the forms title bar.
    ---------------------------------------
    Made change to the picturebox click which will hide the screenshot program.

    Code:
    Private Sub PB1_Click(sender As Object, e As EventArgs) Handles PB1.Click
            Me.SendToBack()
            Application.DoEvents()
            PB1.Image = GrabScreen((Int(CB1.Text) - 1))
            Application.DoEvents()
            Me.BringToFront()
        End Sub

  2. #2
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,343

    Re: Multi-Monitor ScreenShots

    Thread moved from VB.NET, which is for asking questions, to VB.NET CodeBank, which is for sharing working code.

  3. #3

    Thread Starter
    New Member
    Join Date
    Mar 2024
    Posts
    3

    Re: Multi-Monitor ScreenShots

    Thank You....

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width