[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