Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Как скопировать изображение с экрана? Добавлено: 29.02.08 18:43  

Автор вопроса:  FIX | ICQ: 348680795 
Здравстуйте, надо скопировать часть изображения с экрана монитора в PictureBox(VB.NET). Нашел функцию BitBlt, она копирует содержимое в дескритор hDC, а где он в NET? Если есть другой способ, то скажите пожалуйста какой. Спасибо.

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 29.02.08 19:57
hdc ет integer

Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, ByVal lpInitData As String) As Integer
    Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Integer) As Integer
    Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer) As Integer
    Private Declare Function GetDeviceCaps Lib "gdi32" Alias "GetDeviceCaps" (ByVal hdc As Integer, ByVal nIndex As Integer) As Integer
    Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Integer, ByVal hObject As Integer) As Integer
    Private Declare Function BitBlt Lib "GDI32" (ByVal srchDC As Integer, ByVal srcX As Integer, ByVal srcY As Integer, ByVal srcW As Integer, ByVal srcH As Integer, ByVal desthDC As Integer, ByVal destX As Integer, ByVal destY As Integer, ByVal op As Integer) As Integer
    Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Integer) As Integer
    Private Declare Function DeleteObject Lib "GDI32" (ByVal hObj As Integer) As Integer
    Const SRCCOPY As Integer = &HCC0020
    Private oBackground As Bitmap
    Private FW, FH As Integer
Protected Sub CaptureScreen()
        Dim hSDC, hMDC As Integer
        Dim hBMP, hBMPOld As Integer
        Dim r As Integer
        hSDC = CreateDC(";DISPLAY", "", "", "";)
        hMDC = CreateCompatibleDC(hSDC)
        FW = GetDeviceCaps(hSDC, 8)
        FH = GetDeviceCaps(hSDC, 10)
        hBMP = CreateCompatibleBitmap(hSDC, FW, FH)
        hBMPOld = SelectObject(hMDC, hBMP)
        r = BitBlt(hMDC, 0, 0, FW, FH, hSDC, 0, 0, 13369376)
        hBMP = SelectObject(hMDC, hBMPOld)
        r = DeleteDC(hSDC)
        r = DeleteDC(hMDC)
        oBackground = Image.FromHbitmap(New IntPtr(hBMP))
        ;DeleteObject(hBMP)
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CaptureScreen()
        PictureBox1.Image = oBackground
    End Sub

Ответить

Номер ответа: 2
Автор ответа:
 FIX



ICQ: 348680795 

Вопросов: 39
Ответов: 62
 Профиль | | #2 Добавлено: 29.02.08 21:35
Спасибо. Работает. Но кое-что не ясно:
1)Private FW, FH As Integer
  здесь обе переменные - Integer?
2)Protected Sub CaptureScreen()
  Что дает Protected?
3)как я понял FW и FH длина и ширина, но не в пикселях, а как сделать в пикселях?
4)r = BitBlt(hMDC, 0, 0, FW, FH, hSDC, 0, 0, 13369376)
  почему именно 13369376
5)подскажите нормальный онлайн api справочник с описанием функций

Ответить

Номер ответа: 3
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #3
Добавлено: 29.02.08 22:03
1. да, обе
2. не заморачивайся, просто так было в исходнике, который нашел, можешь написать просто Private
3. почему это не в пикселях, очень даже в пикселях
4. 13369376 ето
Const SRCCOPY As Integer = &HCC0020
автор исходника просто забыл, что писал подругому)

Ответить

Номер ответа: 4
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #4 Добавлено: 29.02.08 23:21
Вот, по-другому снимок экрана
Снимок активного окна


Function GetScreenshot() As Image
        Return GetScreenshot(False)
    End Function
    Function GetScreenshot(ByVal activeWindow As Boolean) As Image
        ' Для получения снимка активного окна
        If activeWindow Then
            SendKeys.SendWait("%{PRTSC}";)
        Else
            SendKeys.SendWait("{PRTSC 2}";)
        End If

        ' в буфере обмена содержится снимок
        Return DirectCast( _
           Clipboard.GetDataObject().GetData(DataFormats.Bitmap), _
           Image)
    End Function
   
   
    Private Sub Button_Снимок_с_экрана_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Снимок_с_экрана.Click

        PictureBox1.Image = GetScreenshot()

        'Для получения снимка экрана используйте False
        PictureBox1.Image = GetScreenshot(False)

    End Sub

    Private Sub Button_Снимок_активного_окно_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Снимок_активного_окно.Click
        'Организуем необходимую задержку В течение 3-х секунд кликнете по окну, с которого надо получить снимок
        System.Threading.Thread.Sleep(3000)

        PictureBox1.Image = GetScreenshot()

        'Для получения снимка активного окна используйте True
        PictureBox1.Image = GetScreenshot(True)
    End Sub

Ответить

Номер ответа: 5
Автор ответа:
 ника



Вопросов: 1
Ответов: 111


 Профиль | | #5 Добавлено: 29.02.08 23:33
Ну вы и извращенцы... Зачем все эти костыли?
У объекта Graphics есть статический метод CopyFromScreen, вот его и юзайте! Одна строка кода и будет вам счастье!

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 03.03.08 09:43
+1

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам