-1

I'm using this code to capture desktop

Private Function cc() As Bitmap
    Dim s As Screen = Screen.PrimaryScreen
    Dim img As New Bitmap(s.Bounds.Width, s.Bounds.Height)
    Dim gr As Graphics = Graphics.FromImage(img)
    gr.CopyFromScreen(s.Bounds.Location, Point.Empty, s.Bounds.Size)
    Return img
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
        Me.PictureBox1.Image = cc()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

But now I want to capture only the active screen, how can I do that?

Regards,,,,,

dovid
  • 6,354
  • 3
  • 33
  • 73
Max45
  • 11
  • 1
  • 5

2 Answers2

3

for copy active window from our application, Just check the position and size of the window and reduced the copying to this rectangle:

Public Sub ScreenCopy(Optional file As String = "d:\test.jpg")
    Dim bounds = Me.Bounds
    Using bitmap As New Bitmap(bounds.Width, bounds.Height)

        Using g = Graphics.FromImage(bitmap)
            g.CopyFromScreen(New Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size)
        End Using

        bitmap.Save(file, ImageFormat.Jpeg)
        Process.Start(file) ' for test purposes
    End Using
End Sub

for copy current active window even is not part of our application you need use an api for detect his size and location.

for this use this class (credit: @KvanTTT: https://stackoverflow.com/a/9087955/1271037)

Class ScreenCapturer
    <DllImport("user32.dll")> _
    Private Shared Function GetForegroundWindow() As IntPtr
    End Function

    <DllImport("user32.dll")> _
    Private Shared Function GetWindowRect(hWnd As IntPtr, ByRef rect As Rect) As IntPtr
    End Function

    <StructLayout(LayoutKind.Sequential)> _
    Private Structure Rect
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer
    End Structure

    Public Function Capture(Optional activeWindowOnly As Boolean = True) As Bitmap
        Dim bounds As Rectangle

        If Not activeWindowOnly Then
            bounds = Screen.GetBounds(Point.Empty)
            CursorPosition = Cursor.Position
        Else
            Dim foregroundWindowsHandle = GetForegroundWindow()
            Dim rect = New Rect()
            GetWindowRect(foregroundWindowsHandle, rect)
            bounds = New Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top)
            CursorPosition = New Point(Cursor.Position.X - rect.Left, Cursor.Position.Y - rect.Top)
        End If

        Dim result = New Bitmap(bounds.Width, bounds.Height)

        Using g = Graphics.FromImage(result)
            g.CopyFromScreen(New Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size)
        End Using

        Return result
    End Function

    Public Property CursorPosition() As Point

End Class

how to use:

Public Sub ScreenCopy(Optional file As String = "d:\test.jpg")
    Dim sc = New ScreenCapturer()

    Using bitmap = sc.Capture()
        bitmap.Save(file, ImageFormat.Jpeg)
        Process.Start(file) ' for test purposes
    End Using
End Sub
dovid
  • 6,354
  • 3
  • 33
  • 73
0

Only a small change in syntax for VB.net regarding the DLL import:

<DllImport("user32.dll", EntryPoint:="GetForegroundWindow")> Private Shared Function GetForegroundWindow() As IntPtr
 End Function

 <DllImport("user32.dll", EntryPoint:="GetWindowRect")> Private Shared Function GetWindowRect(hWnd As IntPtr, ByRef rect As Rect) As IntPtr
  End Function