Страница: 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
Ответить
|
Номер ответа: 2 Автор ответа: Spiritsun
Вопросов: 15 Ответов: 44
|
Профиль | | #2
|
Добавлено: 22.10.10 20:54
|
Спс, воспользовался твими советами, получше стало. Помоги, пжалста, знаеж может метод какой, чтобы скриншот без проблем снять? Тут альтернативная идейка возникла с эмуляцией нажатия на кл PrtScr. Скриншот с игры снимается, какбы всё нома, но порой выскакивает ошибка "Сбой при выполнении запрошенной операции с буфером обмена", хотя вроде как процедуры полностью продуманы. Может есть способ записать в буфер обмена скриншот по методу нажатия на кл PrtScr минуя клавиатуру?
Вот код с траблом таким.. беда прост, не помогают ни 3-е нажатие, ни паузы.. раз на раз:
- Dim sc As Image
- Dim tstclp As Boolean = False
- Dim sw, sh, i As Integer
- Try
- i = 0
- Clipboard.Clear()
- keybd_event(&H2C, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
- keybd_event(&H2C, 0, KEYEVENTF_EXTENDEDKEY Or 0, 0)
- keybd_event(&H2C, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
- tstclp = Clipboard.ContainsImage()
- If tstclp Then
- sc = Clipboard.GetImage()
- sw = sc.Size.Width
- sh = sc.Size.Height
- Dim scrpic3 As New Bitmap(sc, CInt(Fix(scl * sw / 100)), CInt(Fix(scl * sh / 100)))
- Dim gscrpic3 As Graphics = Graphics.FromImage(scrpic3)
- 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))
- scrpic3.Save(FileNameDate, ImageFormat.Jpeg)
- scrpic3.Dispose()
- gscrpic3.Dispose()
- End If
- Catch ex As Exception
- err(ex.Message)
- End Try
Ответить
|
Номер ответа: 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)), такчто не выход.. тут нужен сильный метод, может даже через дебри винды.
Ответить
|
Страница: 1 |
Поиск по форуму