Results 1 to 3 of 3

Thread: System Display Scale Causing ScreenShot to be Out of Bounds

  1. #1

    Thread Starter
    Frenzied Member toecutter's Avatar
    Join Date
    Apr 2006
    Location
    Brisbane, Australia
    Posts
    1,146

    System Display Scale Causing ScreenShot to be Out of Bounds

    Hi, iam using below code to take a screenshot of the form so i can then print but if the System Display Scale is set at more than 100% the image is magnified and is larger than the jpg size.

    Is there a way to handle the scale using code before executing the below sub?

    Code:
       
     Private Sub TakeSSData_Click(sender As Object, e As EventArgs) Handles TakeSSData.Click
            Me.Hide()
            Dim SC As New ScreenShot.ScreenCapture
            Dim MyBitMap As Bitmap = SC.CaptureDeskTopRectangle(New Rectangle(Me.Location.X, Me.Location.Y, Me.Width, Me.Height), Form1.Width, Form1.Height)
            Using fsd As New SaveFileDialog
                fsd.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*"
                fsd.FileName = "data"
                fsd.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\weights"
                If fsd.ShowDialog() = Windows.Forms.DialogResult.OK Then
                    MyBitMap.Save(fsd.FileName, Imaging.ImageFormat.Jpeg)
                End If
            End Using
        End Sub

  2. #2
    .NUT jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    109,263

    Re: System Display Scale Causing ScreenShot to be Out of Bounds

    No idea what ScreenShot.ScreenCapture is. It appears to be a third-party type.

  3. #3

    Thread Starter
    Frenzied Member toecutter's Avatar
    Join Date
    Apr 2006
    Location
    Brisbane, Australia
    Posts
    1,146

    Re: System Display Scale Causing ScreenShot to be Out of Bounds

    Quote Originally Posted by jmcilhinney View Post
    No idea what ScreenShot.ScreenCapture is. It appears to be a third-party type.
    sorry jm, cannot remember where i got this from it was over 10 years ago

    Code:
    Imports System
    Imports System.Runtime.InteropServices
    Imports System.Drawing
    Imports System.Drawing.Imaging
    
    Namespace ScreenShot
        '/ Provides functions to capture the entire screen, or a particular window, and save it to a file.
        Public Class ScreenCapture
            '/ Creates an Image object containing a screen shot of the entire desktop
            Public Function CaptureScreen() As Image
                Return CaptureWindow(User32.GetDesktopWindow())
            End Function 'CaptureScreen
            '/ Creates an Image object containing a screen shot of a specific window
    
            Public Function CaptureWindow(ByVal handle As IntPtr) As Image
                Dim SRCCOPY As Integer = &HCC0020
                ' get te hDC of the target window
                Dim hdcSrc As IntPtr = User32.GetWindowDC(handle)
                ' get the size
                Dim windowRect As New User32.RECT
                User32.GetWindowRect(handle, windowRect)
                Dim width As Integer = windowRect.right - windowRect.left
                Dim height As Integer = windowRect.bottom - windowRect.top
                ' create a device context we can copy to
                Dim hdcDest As IntPtr = GDI32.CreateCompatibleDC(hdcSrc)
                ' create a bitmap we can copy it to,
                ' using GetDeviceCaps to get the width/height
                Dim hBitmap As IntPtr = GDI32.CreateCompatibleBitmap(hdcSrc, width, height)
                ' select the bitmap object
                Dim hOld As IntPtr = GDI32.SelectObject(hdcDest, hBitmap)
                ' bitblt over
                GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, SRCCOPY)
                ' restore selection
                GDI32.SelectObject(hdcDest, hOld)
                ' clean up 
                GDI32.DeleteDC(hdcDest)
                User32.ReleaseDC(handle, hdcSrc)
                ' get a .NET image object for it
                Dim img As Image = Image.FromHbitmap(hBitmap)
                ' free up the Bitmap object
                GDI32.DeleteObject(hBitmap)
                Return img
            End Function 'CaptureWindow
    
            '/ Captures a screen shot of a specific window, and saves it to a file
            Public Sub CaptureWindowToFile(ByVal handle As IntPtr, ByVal filename As String, ByVal format As ImageFormat)
                Dim img As Image = CaptureWindow(handle)
                img.Save(filename, format)
            End Sub 'CaptureWindowToFile
    
            '/ Captures a screen shot of the entire desktop, and saves it to a file
            Public Sub CaptureScreenToFile(ByVal filename As String, ByVal format As ImageFormat)
                Dim img As Image = CaptureScreen()
                img.Save(filename, format)
            End Sub 'CaptureScreenToFile
    
            Public Function CaptureDeskTopRectangle(ByVal CapRect As Rectangle, ByVal CapRectWidth As Integer, ByVal CapRectHeight As Integer) As Bitmap
                '/ Returns BitMap of the region of the desktop, similar to CaptureWindow, but can be used to 
                '/ create a snapshot of the desktop when no handle is present, by passing in a rectangle 
                '/ Grabs snapshot of entire desktop, then crops it using the passed in rectangle's coordinates
                Dim SC As New ScreenShot.ScreenCapture
                Dim bmpImage As New Bitmap(SC.CaptureScreen)
                Dim bmpCrop As New Bitmap(CapRectWidth, CapRectHeight, bmpImage.PixelFormat)
                Dim recCrop As New Rectangle(CapRect.X, CapRect.Y, CapRectWidth, CapRectHeight)
                Dim gphCrop As Graphics = Graphics.FromImage(bmpCrop)
                Dim recDest As New Rectangle(0, 0, CapRectWidth, CapRectHeight)
                gphCrop.DrawImage(bmpImage, recDest, recCrop.X, recCrop.Y, recCrop.Width,
                  recCrop.Height, GraphicsUnit.Pixel)
                Return bmpCrop
            End Function
    
            '/ Helper class containing Gdi32 API functions
            Private Class GDI32
                Public SRCCOPY As Integer = &HCC0020
                ' BitBlt dwRop parameter
                Declare Function BitBlt Lib "gdi32.dll" (
                    ByVal hDestDC As IntPtr,
                    ByVal x As Int32,
                    ByVal y As Int32,
                    ByVal nWidth As Int32,
                    ByVal nHeight As Int32,
                    ByVal hSrcDC As IntPtr,
                    ByVal xSrc As Int32,
                    ByVal ySrc As Int32,
                    ByVal dwRop As Int32) As Int32
                Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (
                    ByVal hdc As IntPtr,
                    ByVal nWidth As Int32,
                    ByVal nHeight As Int32) As IntPtr
                Declare Function CreateCompatibleDC Lib "gdi32.dll" (
                    ByVal hdc As IntPtr) As IntPtr
                Declare Function DeleteDC Lib "gdi32.dll" (
                    ByVal hdc As IntPtr) As Int32
                Declare Function DeleteObject Lib "gdi32.dll" (
                    ByVal hObject As IntPtr) As Int32
                Declare Function SelectObject Lib "gdi32.dll" (
                    ByVal hdc As IntPtr,
                    ByVal hObject As IntPtr) As IntPtr
            End Class 'GDI32
    
            '/ Helper class containing User32 API functions
            Public Class User32
                <StructLayout(LayoutKind.Sequential)>
                Public Structure RECT
                    Public left As Integer
                    Public top As Integer
                    Public right As Integer
                    Public bottom As Integer
                End Structure 'RECT
    
                Declare Function GetDesktopWindow Lib "user32.dll" () As IntPtr
                Declare Function GetWindowDC Lib "user32.dll" (
                    ByVal hwnd As IntPtr) As IntPtr
                Declare Function ReleaseDC Lib "user32.dll" (
                    ByVal hwnd As IntPtr,
                    ByVal hdc As IntPtr) As Int32
                Declare Function GetWindowRect Lib "user32.dll" (
                    ByVal hwnd As IntPtr,
                    ByRef lpRect As RECT) As Int32
            End Class 'User32
        End Class 'ScreenCapture 
    End Namespace 'ScreenShot

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