none
Как сделать скриншот формы, если она выходит за пределы экрана? RRS feed

  • Вопрос

  • Как сделать скриншот формы, если она выходит за пределы экрана?

    Столкнулся с проблемой, что нужно сохранять изображение формы в графический файл. Эта возможность должна работать на разных разрешениях монитора.

    Т.е. есть ситуация, что форма вылезет за пределы экрана, но в файл она должна сохранятся полностью, а не только ее видимый на мониторе фрагмент.

    Подскажите, пожалуйста, в каком направлении думать? )))


    P.S.

    Желательно код на VB.Net

    • Изменено sg6336 5 июля 2011 г. 15:13 Забыл указать язык на котором пишу
    4 июля 2011 г. 11:38

Ответы

  • Здравствуйте, попробуйте воспользоваться функцией PrintWindow, пример можно посмотреть в обсуждениии Get a screenshot of a specific application


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 5 июля 2011 г. 8:54
    • Помечено в качестве ответа sg6336 5 июля 2011 г. 15:10
    • Снята пометка об ответе sg6336 5 июля 2011 г. 15:13
    • Помечено в качестве ответа sg6336 6 июля 2011 г. 18:46
    4 июля 2011 г. 13:14
  • Вроде правильно вы все перевели на vb.net, ошибок компиляции нету. Теперь вам остается вызвать метод PrintWindow(IntPrt), передав ему дескриптор окна, скриншот которого вы хотите получить. В результате выполнения метод вернет Bitmap изображение, сохраняйте его куда нужно. Это и будет снимок программы.

    Т.е. вам нужно сделать:

      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim bitmap = PrintWindow(Me.Handle)
        bitmap.Save("test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
      End Sub
    

    Хотя сохранение вы уже сделали, так что нужен только вызов функции.


    Для связи [mail]
    • Помечено в качестве ответа sg6336 6 июля 2011 г. 18:39
  • Вот полностью рабочий код «как есть». Если буду улучшать его, то сброшу новый вариант.

    Огромное человеческое спасибо.

     

    Этот код сохраняет только заданную форму. Вне зависимости, выходит она за пределы экрана или нет.

     

    'Попытка сохранить форму

        <Runtime.InteropServices.DllImport("user32.dll")> _

        Public Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As Rect) As Boolean

        End Function

        <Runtime.InteropServices.DllImport("user32.dll")> _

        Public Shared Function PrintWindow(ByVal hWnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As Integer) As Boolean

        End Function

     

        Public Structure Rect

            Public left As Integer

            Public top As Integer

            Public right As Integer

            Public bottom As Integer

        End Structure

     

        Public Shared Function PrintWindow(ByVal hwnd As IntPtr) As Bitmap

            Dim rc As RECT

            GetWindowRect(hwnd, rc)

     

            Dim width As Integer = rc.right - rc.left

            Dim height As Integer = rc.bottom - rc.top

     

            Dim bmp As New Bitmap(width, height, Imaging.PixelFormat.Format32bppArgb)

            Dim gfxBmp As Graphics = Graphics.FromImage(bmp)

            Dim hdcBitmap As IntPtr = gfxBmp.GetHdc()

            PrintWindow(hwnd, hdcBitmap, 0)

            gfxBmp.ReleaseHdc(hdcBitmap)

            gfxBmp.Dispose()

            'bmp.Save("g:\TestPhotoQualityZero.jpg") 'добавил от себя

            Return bmp

        End Function

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim bitmap = PrintWindow(Me.Handle)

            bitmap.Save("g:\TestPhotoQualityZero.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

        End Sub

     

    • Помечено в качестве ответа sg6336 6 июля 2011 г. 18:45
    6 июля 2011 г. 18:45

Все ответы

  • Здравствуйте, попробуйте воспользоваться функцией PrintWindow, пример можно посмотреть в обсуждениии Get a screenshot of a specific application


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 5 июля 2011 г. 8:54
    • Помечено в качестве ответа sg6336 5 июля 2011 г. 15:10
    • Снята пометка об ответе sg6336 5 июля 2011 г. 15:13
    • Помечено в качестве ответа sg6336 6 июля 2011 г. 18:46
    4 июля 2011 г. 13:14
  • Уважаемый пользователь, если чье-либо сообщение является решением вашей проблемы, то, отмечайте его как ответ. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'. Спасибо.


    Для связи [mail]
  • Извините, пока думаю. Мне нужно написать на VB.net, а пример на C# (который мне не известен). Когда закончу, то выложу код.

    5 июля 2011 г. 15:06
  • Используйте сервис Convert C# to VB.NET, возникнут проблемы - пишите.


    Для связи [mail]
    5 июля 2011 г. 15:13
  • Получился такой кошмар на VB.Net:

     

        <Runtime.InteropServices.DllImport("user32.dll")> _

        Public Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As Rect) As Boolean

        End Function

        <Runtime.InteropServices.DllImport("user32.dll")> _

        Public Shared Function PrintWindow(ByVal hWnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As Integer) As Boolean

        End Function

     

        Public Structure Rect

            Public left As Integer

            Public top As Integer

            Public right As Integer

            Public bottom As Integer

        End Structure

     

        Public Shared Function PrintWindow(ByVal hwnd As IntPtr) As Bitmap

            Dim rc As RECT

            GetWindowRect(hwnd, rc)

     

            Dim width As Integer = rc.right - rc.left

            Dim height As Integer = rc.bottom - rc.top

     

            Dim bmp As New Bitmap(width, height, Imaging.PixelFormat.Format32bppArgb)

            Dim gfxBmp As Graphics = Graphics.FromImage(bmp)

            Dim hdcBitmap As IntPtr = gfxBmp.GetHdc()

            PrintWindow(hwnd, hdcBitmap, 0)

            gfxBmp.ReleaseHdc(hdcBitmap)

            gfxBmp.Dispose()

            bmp.Save("g:\TestPhotoQualityZero.jpg") 'добавил от себя

            Return bmp

        End Function

     

    Возможно здесь куча ошибок.

    Вопрос, как эту функцию запустить? Что бы начать отладку.

    Раньше с API функциями в VB.Net не работал.

    5 июля 2011 г. 16:39
  • Вроде правильно вы все перевели на vb.net, ошибок компиляции нету. Теперь вам остается вызвать метод PrintWindow(IntPrt), передав ему дескриптор окна, скриншот которого вы хотите получить. В результате выполнения метод вернет Bitmap изображение, сохраняйте его куда нужно. Это и будет снимок программы.

    Т.е. вам нужно сделать:

      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim bitmap = PrintWindow(Me.Handle)
        bitmap.Save("test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
      End Sub
    

    Хотя сохранение вы уже сделали, так что нужен только вызов функции.


    Для связи [mail]
    • Помечено в качестве ответа sg6336 6 июля 2011 г. 18:39
  • Вот полностью рабочий код «как есть». Если буду улучшать его, то сброшу новый вариант.

    Огромное человеческое спасибо.

     

    Этот код сохраняет только заданную форму. Вне зависимости, выходит она за пределы экрана или нет.

     

    'Попытка сохранить форму

        <Runtime.InteropServices.DllImport("user32.dll")> _

        Public Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As Rect) As Boolean

        End Function

        <Runtime.InteropServices.DllImport("user32.dll")> _

        Public Shared Function PrintWindow(ByVal hWnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As Integer) As Boolean

        End Function

     

        Public Structure Rect

            Public left As Integer

            Public top As Integer

            Public right As Integer

            Public bottom As Integer

        End Structure

     

        Public Shared Function PrintWindow(ByVal hwnd As IntPtr) As Bitmap

            Dim rc As RECT

            GetWindowRect(hwnd, rc)

     

            Dim width As Integer = rc.right - rc.left

            Dim height As Integer = rc.bottom - rc.top

     

            Dim bmp As New Bitmap(width, height, Imaging.PixelFormat.Format32bppArgb)

            Dim gfxBmp As Graphics = Graphics.FromImage(bmp)

            Dim hdcBitmap As IntPtr = gfxBmp.GetHdc()

            PrintWindow(hwnd, hdcBitmap, 0)

            gfxBmp.ReleaseHdc(hdcBitmap)

            gfxBmp.Dispose()

            'bmp.Save("g:\TestPhotoQualityZero.jpg") 'добавил от себя

            Return bmp

        End Function

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim bitmap = PrintWindow(Me.Handle)

            bitmap.Save("g:\TestPhotoQualityZero.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

        End Sub

     

    • Помечено в качестве ответа sg6336 6 июля 2011 г. 18:45
    6 июля 2011 г. 18:45