Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Скриншот игры Добавлено: 19.10.10 13:01  

Автор вопроса:  Spiritsun
Всем привет, давненько тут небыл. Есть проблема, очень надеюсь на вашу помощь, может уже создавались темы и есть решение, поделитесь ссылками, пжалста.

Проблема в том, что для создания скриншота полноэкранного приложения (игры) в 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
Автор ответа:
 AgentFire



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..... блаблабла перепиши следующим:
  1. tekDate = DateTime.Now.ToString("dd.MM.yy HH-mm-ss")

6. присваивать переменным значения можно сразу в объявлении, для сокращения кода:
  1. Dim FileNameDate As String = DateTime.Now.ToString("dd.MM.yy HH-mm-ss'.bmp'")
(если не понятно как работает, используй 5й пункт)

Ответить

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



Вопросов: 15
Ответов: 44
 Профиль | | #2 Добавлено: 22.10.10 20:54
Спс, воспользовался твими советами, получше стало. Помоги, пжалста, знаеж может метод какой, чтобы скриншот без проблем снять? Тут альтернативная идейка возникла с эмуляцией нажатия на кл PrtScr. Скриншот с игры снимается, какбы всё нома, но порой выскакивает ошибка "Сбой при выполнении запрошенной операции с буфером обмена", хотя вроде как процедуры полностью продуманы. Может есть способ записать в буфер обмена скриншот по методу нажатия на кл PrtScr минуя клавиатуру?
Вот код с траблом таким.. беда прост, не помогают ни 3-е нажатие, ни паузы.. раз на раз:
 
  1. Dim sc As Image
  2.          Dim tstclp As Boolean = False
  3.          Dim sw, sh, i As Integer ' размеры экрана
  4.             Try
  5.                 i = 0
  6.                 Clipboard.Clear()
  7.                     keybd_event(&H2C, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) ' print screen нажали
  8.                     keybd_event(&H2C, 0, KEYEVENTF_EXTENDEDKEY Or 0, 0) ' удерживаем
  9.                     keybd_event(&H2C, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) ' print screen отпустили
  10.                 tstclp = Clipboard.ContainsImage()
  11.                 If tstclp Then
  12.                     sc = Clipboard.GetImage()
  13.                     sw = sc.Size.Width
  14.                     sh = sc.Size.Height
  15.                     Dim scrpic3 As New Bitmap(sc, CInt(Fix(scl * sw / 100)), CInt(Fix(scl * sh / 100))) ' объект Bitmap для размещения скриншота
  16.                     Dim gscrpic3 As Graphics = Graphics.FromImage(scrpic3) ' управление Bitmap
  17.                     gscrpic3.DrawString("ID Match: " & id & vbCrLf & "Nick: " & nick & vbCrLf & "Time: " & tekH & vbCrLf & "Date: " & tekD, New Font("Arial", 14, FontStyle.Bold, GraphicsUnit.Pixel), New SolidBrush(Color.Red), New Point(10, 10))
  18.                     scrpic3.Save(FileNameDate, ImageFormat.Jpeg) ' запись в файл
  19.                     scrpic3.Dispose()
  20.                     gscrpic3.Dispose()
  21.                 End If
  22.             Catch ex As Exception
  23.                 err(ex.Message)
  24.             End Try

Ответить

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



Вопросов: 15
Ответов: 44
 Профиль | | #3 Добавлено: 22.10.10 20:59
ум, немног поясню, очищаю буфер (6), нажимаю кл PrtScr (7-9), проверяю буфер на наличие формата bitmap (10), получаю скриншот из буфера обмена (12), масштабирую (15), добавляю надпись (17), записываю в файл (18).

Ответить

Номер ответа: 4
Автор ответа:
 Spiritsun



Вопросов: 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
Автор ответа:
 Spiritsun



Вопросов: 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
Автор ответа:
 Spiritsun



Вопросов: 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
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #7 Добавлено: 28.10.10 23:19
d3d для vba? lol

Ответить

Номер ответа: 8
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #8 Добавлено: 29.10.10 19:56
а чо лол то? directx отличн идёт под vba, лично видел демки.

Ответить

Номер ответа: 9
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #9 Добавлено: 30.10.10 10:59
покажи *lol*

Ответить

Страница: 1 |

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



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