Страница: 1 |
Вопрос: Скриншот игры | Добавлено: 19.10.10 13:01 |
Автор вопроса: ![]() |
Всем привет, давненько тут небыл. Есть проблема, очень надеюсь на вашу помощь, может уже создавались темы и есть решение, поделитесь ссылками, пжалста.
Проблема в том, что для создания скриншота полноэкранного приложения (игры) в win7 нужно в св-ах exe в вкладке совместимость поставить галку на Отключить композицию рабочего стола и в игре не должно быть выставлено сглаживание (anti-aliasing), тогда всё прокатывает. Но мне нужно, чтобы прога работала при любых условиях и по крайней мере в XP, win7. Вот полный текст. Imports System
Imports System.IO Imports System.Globalization Imports System.Drawing.Imaging 'для скриншота Imports System.Windows.Forms Imports System.Windows Public Class Main ' Функции API Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long) ' для прверки нажатия клавиши Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer) 'Sleep(n) - пауза в миллисекундах 1сек = 1000млсек Private Sub Старт_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Старт.Click Me.WindowState = System.Windows.Forms.FormWindowState.Minimized End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick System.Windows.Forms.Application.DoEvents() If GetAsyncKeyState(&H20) Then ' space - скриншот для отладки savescr() End If If GetAsyncKeyState(&H1B) Then ' esc - выход End End If End Sub Private Sub savescr() Dim FileNameDate As String Dim tekDate As String Dim td As Date Dim dat As Object Dim sw, sh As Integer ' размеры экрана dat = td.Now ' тек дата tekDate = Microsoft.VisualBasic.DateAndTime.Day(dat) & "." & Month(dat) & "." & Year(dat) & " " & Hour(dat) & "." & Minute(dat) & "." & Second(dat) FileNameDate = tekDate & ".bmp" sw = My.Computer.Screen.WorkingArea.Size.Width sh = My.Computer.Screen.WorkingArea.Size.Height Dim scrpic As New Bitmap(sw, sh) ' объект Bitmap для размещения скриншота Dim gscrpic As Graphics = Graphics.FromImage(scrpic) ' управление Bitmap gscrpic.Clear(Color.FromArgb(13, 11, 12)) ' устранение пустых точек gscrpic.CopyFromScreen(New Point(0, 0), New Point(0, 0), New Size(sw, sh)) ' скриншот всего игр поля scrpic.Save(FileNameDate, ImageFormat.Bmp) ' запись в файл End Sub End Class |
Ответы | Всего ответов: 9 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #1 | Добавлено: 19.10.10 15:29 |
объявления первой API у тебя старое. второй тоже, но вместо нее можно использовать Threading.Thread.Sleep(int32). она кстати не используется у тебя.
1. перепиши объявление. 2. gscrpic As Graphic - используй dispose после использования 3. тоже самое касается scrpic As Bitmap 4. DoEvents() лишний. 5. tekDate = Microsoft.VisualBasic..... блаблабла перепиши следующим:
6. присваивать переменным значения можно сразу в объявлении, для сокращения кода:
|
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 44 |
Профиль | Цитата | #2 | Добавлено: 22.10.10 20:54 |
Спс, воспользовался твими советами, получше стало. Помоги, пжалста, знаеж может метод какой, чтобы скриншот без проблем снять? Тут альтернативная идейка возникла с эмуляцией нажатия на кл PrtScr. Скриншот с игры снимается, какбы всё нома, но порой выскакивает ошибка "Сбой при выполнении запрошенной операции с буфером обмена", хотя вроде как процедуры полностью продуманы. Может есть способ записать в буфер обмена скриншот по методу нажатия на кл PrtScr минуя клавиатуру?
Вот код с траблом таким.. беда прост, не помогают ни 3-е нажатие, ни паузы.. раз на раз:
|
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 44 |
Профиль | Цитата | #3 | Добавлено: 22.10.10 20:59 |
ум, немног поясню, очищаю буфер (6), нажимаю кл PrtScr (7-9), проверяю буфер на наличие формата bitmap (10), получаю скриншот из буфера обмена (12), масштабирую (15), добавляю надпись (17), записываю в файл (18). |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 44 |
Профиль | Цитата | #4 | Добавлено: 22.10.10 22:17 |
Кстати, изварот с мудрёной командой GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY) равносилен gscrpic.CopyFromScreen(New Point(0, 0), New Point(0, 0), New Size(sw, sh)), такчто не выход.. тут нужен сильный метод, может даже через дебри винды. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 44 |
Профиль | Цитата | #5 | Добавлено: 28.10.10 22:39 |
И вот теперь у меня еще больше проблем, узрел идею через Direct3d, но написано либ на старых языках, либ на других. Знает ктонить чтонить про это на vba? Вот пару ссылок:
http://www.gamedev.net/community/for...opic_id=359794 http://spazzarama.wordpress.com/2009...with-direct3d/ http://msdn.microsoft.com/en-us/libr...nerate_a_scene |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 44 |
Профиль | Цитата | #6 | Добавлено: 28.10.10 22:40 |
http://www.gamedev.net/community/forums/topic.asp?topic_id=359794
http://spazzarama.wordpress.com/2009/02/07/screencapture-with-direct3d/ http://msdn.microsoft.com/en-us/library/bb323981(v=VS.85).aspx#_dx_directx_graphics_generate_a_scene |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #7 | Добавлено: 28.10.10 23:19 |
d3d для vba? lol |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 15 Ответов: 44 |
Профиль | Цитата | #8 | Добавлено: 29.10.10 19:56 |
а чо лол то? directx отличн идёт под vba, лично видел демки. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #9 | Добавлено: 30.10.10 10:59 |
покажи *lol* |
Страница: 1 |
|