Страница: 1 |
Страница: 1 |
Вопрос: Захват экрана
Добавлено: 01.01.08 21:59
Автор вопроса:
lexei | ICQ: 464882716
Такой вопросик. У меня есть приложение, которое выводит объекты Direct3D в пикчербокс, который занимает не весь экран. Как сохранить картинку в пикчербоксе (тоесть сцену)в бмп файл?
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа: Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #1
Добавлено: 01.01.08 23:15
Как на NET не знаю, но ты напшешь сам, посмотрев пример на VB клавиши то ведь, не кто не отменял?
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const VK_MENU = &H12
Const KEYEVENTF_KEYUP = &H2
Const VK_SNAPSHOT = &H2C
Private Sub Picture_bufer()
Call keybd_event(VK_SNAPSHOT, 0, 0, 0) 'Hажимаем Print Screen
Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0) 'Отпускаем Print Screen
End Sub
Private Sub Command1_Click()
Picture_bufer
End Sub
Private Sub Command2_Click()
Picture1.Picture = Clipboard.GetData'вставка из буфера
End Sub
Private Sub Command3_Click()
SavePicture Picture1.Picture, "C:\Ess.bmp"
End Sub
Номер ответа: 2
Автор ответа: Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #2
Добавлено: 01.01.08 23:18
VB нет у меня ошибся извени
Private Sub Command1_Click()
Picture1.Picture = Picture_bufer
End Sub
Номер ответа: 3
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #3
Добавлено: 01.01.08 23:19
Как я понял это просто скрин экрана. Но прикол в том, что у меня пикчербокс (сцена) занимает не весь экран.
Номер ответа: 4
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #4
Добавлено: 01.01.08 23:20
Извени, понял
Номер ответа: 5
Автор ответа: Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #5
Добавлено: 01.01.08 23:22
Блин все было правильно, новый год однако.
Номер ответа: 6
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #6
Добавлено: 01.01.08 23:24
И всё таки, по моему это скрин всего экрана
Номер ответа: 7
Автор ответа: Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #7
Добавлено: 02.01.08 00:06
И всё таки, по моему это скрин всего экрана
Ну да,(Заголовок читай), а если октивного окна то
Call keybd_event(VK_MENU, 0, 0, 0) 'Hажимаем Alt
Call keybd_event(VK_SNAPSHOT, 0, 0, 0) 'Hажимаем Print Screen
Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0) 'Отпускаем Print Screen
Call keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0) 'Отпускаем Alt
' End
End Sub
А если конкретного то много АПИ , а как ваш язык с этим дружит незнаю? Если не кто не отвтит дам код на АПИ, для любого контрола, но завтра, сейчас спать ХОЧЮ. С новым годом!
Номер ответа: 8
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #8
Добавлено: 03.01.08 17:14
Хорошо, есть другой вариант. Как из рисунка вырезать прямоугольную область (зная её коотдинаты), и сохранить её?
Номер ответа: 9
Автор ответа: Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #9
Добавлено: 03.01.08 22:02
'Функция StretchBlt копирует часть изображения от одного Picture в
'другое. Эта функция также позволяет масштабировать (сжимать, растягивать,
'выворачивать наизнанку, задавая параметры с разными знаками)
Private Declare Function StretchBlt Lib "gdi32" _
 ByVal hdc As Long, ByVal X As Long, _
ByVal Y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hSrcDC As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal hSrcWidth As Long, ByVal nSrcHeight As Long, _
ByVal dwRop As Long) As Long
Это наверно есть и у вас?
а сохраняем типа как у нас
SavePicture Picture1.Image, путь куда
Номер ответа: 10
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #10
Добавлено: 03.01.08 22:09
В принципи есть функция BitBlt которая захватывает часть экрана. Но проблема в том, что я на ВБ.НЕТ перевести её не могу.
Номер ответа: 11
Автор ответа: Боцман
ICQ: 295725312
Вопросов: 53
Ответов: 830
Web-сайт:
Профиль | | #11
Добавлено: 03.01.08 22:24
Ну что сказать? В 1 посте уже писал, как на NET не знаю!!! Видел его пару дней, фал инсталяции привел в ужас, снес...н.ф. А вообще ари должны работать везде, по моему?
Номер ответа: 12
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #12
Добавлено: 03.01.08 22:43
Работает та везде, но вызов, синтаксис разный. Нашол пример BitBlt на 6.0, пытаюсь перевести.
Номер ответа: 13
Автор ответа: lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #13
Добавлено: 03.01.08 23:00
УРРА!!!!!
Нашол
Пашет!!!
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms
Public Class Form1
<llImport("user32.dll"
> _
Public Shared Function GetDesktopWindow() As IntPtr
End Function
<System.Runtime.InteropServices.DllImport("user32.dll"> _
Public Shared Function GetWindowDC(ByVal hwnd As IntPtr) As IntPtr
End Function
<System.Runtime.InteropServices.DllImport("gdi32.dll"> _
Public Shared Function BitBlt(ByVal hDestDC As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As IntPtr, _
ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal dwRop As Integer) As UInt64
End Function
<STAThread()> _
Private Shared Sub Main(ByVal args As String())
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myImage As Image = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
Dim gr1 As Graphics = Graphics.FromImage(myImage)
Dim dc1 As IntPtr = gr1.GetHdc()
Dim dc2 As IntPtr = GetWindowDC(GetDesktopWindow())
BitBlt(dc1, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc2, _
0, 0, 13369376)
gr1.ReleaseHdc(dc1)
myImage.Save("C:\screenshot.png", ImageFormat.Png)
End Sub
End Class