Фото скрытого участка экрана

vaniak1

Уважаемые форумчане! Возможно ли выполнить снимок области приложения, которое в настоящий момент закрыто другой программой? Например, работает Word, а под ним на весь экран открыта какая-то другая программа. И необходимо получить снимок экрана именно этой программы, а не Ворда, который в это время находится сверху. Спасибо.
9 ответов

vaniak1

И необходимо получить снимок экрана именно этой программы
а ИМЕННО ЭТА программа ваша или сторонняя?


vaniak1

сторонняяНо при этом я точно знаю полный адрес исполняемого файла


vaniak1

Но при этом я точно знаю полный адрес исполняемого файла
а запускаете вы его из своей программы?


vaniak1

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


vaniak1

vaniak1, ну раз знаете Handle окна, тогда вот так (взял из старого проекта на VB6 и переделал на VB.NET):
Private Declare Function PrintWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As ********) As Boolean
 
    Public Function GetScreenCustomWindow(HWND As Integer) As Image
        Dim bmp As New Bitmap(Size.Width, Size.Height)
        Using g As Graphics = Graphics.FromImage(bmp)
            Dim dc = g.GetHdc()
            PrintWindow(HWND, dc, 0)
            Return bmp
        End Using
    End Function
Писал на скорую руку, поэтому Size.Width, Size.Height сам надеюсь догадаешься как получить.


vaniak1

Для отображаемого экрана я использовал:
 Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    Dim q As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(screenGrab)
    Dim ScreenSize As Size = New Size(28, 304)
 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            q.CopyFromScreen(7, 211, 35, 515, ScreenSize)
            screenGrab.Save(Application.StartupPath & "\Screen.bmp")
    End Sub
По предоставленному выше коду - не могу разобраться, очень жалею....


vaniak1

vaniak1, ну а если окно не полноэкранное и нужно узнать лишь изображение окна? тут думаю тебе поможет еще одна API...Вот полный код... Адаптируй его под себя
Public Class Form1
    Public Declare Function PrintWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As ********) As Boolean
    Public Declare Auto Function GetWindowInfo Lib "user32" (ByVal hwnd As IntPtr, ByRef pwi As WINDOWINFO) As Boolean
 
    <System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)> Structure WINDOWINFO
        Dim cbSize As Integer
        Dim rcWindow As Rectangle
        Dim rcClient As Rectangle
        Dim dwStyle As Integer
        Dim dwExStyle As Integer
        Dim dwWindowStatus As ******
        Dim cxWindowBorders As ******
        Dim cyWindowBorders As ******
        Dim atomWindowType As UInt16
        Dim wCreatorVersion As Short
    End Structure
 
    Public Function GetScreenCustomWindow(HWND As Integer) As Image
 
        Dim info As New WINDOWINFO : GetWindowInfo(HWND, info)
 
        Dim bmp As New Bitmap(info.rcWindow.Width, info.rcWindow.Height)
        Using g As Graphics = Graphics.FromImage(bmp)
            Dim dc = g.GetHdc()
            PrintWindow(HWND, dc, 0)
            Return bmp
        End Using
    End Function
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.BackgroundImage = GetScreenCustomWindow(Me.Handle)
    End Sub
End Class
По предоставленному выше коду - не могу разобраться
а что там разбираться? Это готовая функция, возвращающая тебе картинку типа Image, которую ты можешь вставить куда угодно (PictureBox и т.п.)например
PictureBox.Image = GetScreenCustomWindow(Me.Handle)


vaniak1

Мне её не вставлять, мне её сохранить надо


vaniak1

Мне её не вставлять, мне её сохранить надо
Ну что ты как в первый раз, я ведь сказал, что возвращает тип IMAGE, тоесть тоже самое, что и у тебя...Вот так сохраняй
GetScreenCustomWindow(Me.Handle).Save(Application.StartupPath & "\Screen.bmp")