Страница: 1 |
Страница: 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-сайт:
Профиль | | #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("ISPLAY", "", "", ""
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))
 eleteObject(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-сайт:
Профиль | | #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