elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Capturar Foto de Juego !!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Capturar Foto de Juego !!  (Leído 14,126 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #20 en: 2 Julio 2016, 20:26 pm »

Traigo buenas noticias, he probado a hacer la captura con SharpDX y funciona de maravilla :). He usado el mismo ejemplo que el de GitHub, si necesitas ayuda con eso lo traduciré a VB.NET y te mostraré una función de uso genérico (hoy o mañana).

Saludos!


En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #21 en: 2 Julio 2016, 22:33 pm »

Hola,

Muchas gracias espero entonces con el codigo que me dejastes anteriormente me tira la foto cuando esta en FullScreen en Negro completamente lo que no mire es en que resolucion estaba trabajando.

Y la otra me daba error me decia que no encontraba esa funcion o algo similar.

Bueno nada ya espero entonces por esta que trabaja a la par con DirectX.

Salu2 y gracias

PD: De todas formas aun quisiera sino te molesta tratar de ejecutar con exito el tuyo para tenerlo como otra opción. Despues vemos eso con mas calma para decirte el error exacto que me genera con la 2da funcion.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #22 en: 3 Julio 2016, 17:42 pm »

Muchas gracias espero entonces con el codigo que me dejastes anteriormente me tira la foto cuando esta en FullScreen en Negro completamente lo que no mire es en que resolucion estaba trabajando.

Se toma en negro por que como intenté explicarte antes de tomar la captura primero debes minimizar y maximizar el juego para que la imagen estática del juego se actualice. Es complicado esta mierd@ de DirectX y no comprendo del todo como funciona en ese sentido, pero hay que hacer eso ...si utilizamos la metodología Win32/GDI.



De todas formas aun quisiera sino te molesta tratar de ejecutar con exito el tuyo para tenerlo como otra opción.

Lamentablemente eso no va a ser posible, no he logrdo solucionar el problema de no poder "actualizar" la imagen de forma automatizada (quiero decir, sin minimizar y maximizar manualmente la ventana del juego), y he probado técnicas que en un principio deberian funcionar (funciones: ShowWindow, SetForegroundwindow, etc) pero no, eso no funciona, DirectX parece trabajar de una forma compleja la ventana.

Si ni siquiera Windows por si solo ni tampoco (algunas)aplicaciones profesionales pueden tomar una captura en condiciones del juego cuando éste está en fullscreen, mucho menos soy capaz de hacerlo yo sin ser un experto en la materia de gráficos. Es complicado al menos.

Es necesario evitar las limitaciones gráficas del modelo Win32 y recurrir a una metodología más potente como DirectX para tomar ese tipo de captura, por ejemplo usando el wrapper de SharpDX para .NET.



Bueno nada ya espero entonces por esta que trabaja a la par con DirectX.

Aquí tienes. Con esta metodología basada en DirectX ya si que no va a haber problemas para tomar la captura del juego en fullscreen.

Código
  1. Imports System.Drawing.Imaging
  2. Imports System.IO
  3.  
  4. Imports SharpDX
  5. Imports SharpDX.Direct3D11
  6. Imports SharpDX.DXGI
  7. Imports Device = SharpDX.Direct3D11.Device
  8. Imports MapFlags = SharpDX.Direct3D11.MapFlags
  9.  
  10. 'Imports Elektro.Imaging.Tools
  11.  
  12. Namespace Test
  13.  
  14.    Public NotInheritable Class SharpDXUtil
  15.  
  16.        ''' ----------------------------------------------------------------------------------------------------
  17.        ''' <summary>
  18.        ''' Capture the screen output using the default graphics card adapter.
  19.        ''' <para></para>
  20.        ''' This DirectX based methodology is useful to take screenshot of games that are running in full screen.
  21.        ''' <para></para>
  22.        ''' However, using this methodology for other common desktop screen captures will produce unexpected results (such as wrong colors);
  23.        ''' so for common screenshots you should use the methods exposed in <see cref="Elektro.Imaging.Tools.ImageUtil"/> instead.
  24.        ''' </summary>
  25.        ''' ----------------------------------------------------------------------------------------------------
  26.        ''' <returns>
  27.        ''' The resulting <see cref="System.Drawing.Image"/>.
  28.        ''' </returns>
  29.        ''' ----------------------------------------------------------------------------------------------------
  30.        Public Shared Function TakeScreenshot() As Image
  31.  
  32.            Return SharpDXUtil.TakeScreenshot(adapterIndex:=0)
  33.  
  34.        End Function
  35.  
  36.        ''' ----------------------------------------------------------------------------------------------------
  37.        ''' <summary>
  38.        ''' Captures the screen output using the specified graphics card adapter.
  39.        ''' <para></para>
  40.        ''' This DirectX based methodology is useful to take screenshot of games that are running in full screen.
  41.        ''' <para></para>
  42.        ''' However, using this methodology for other common desktop screen captures will produce unexpected results (such as wrong colors);
  43.        ''' so for common screenshots you should use the methods exposed in <see cref="Elektro.Imaging.Tools.ImageUtil"/> instead.
  44.        ''' </summary>
  45.        ''' ----------------------------------------------------------------------------------------------------
  46.        ''' <param name="adapterIndex">
  47.        ''' The index of the graphics card adapter.
  48.        ''' <para></para>
  49.        ''' Set this value to <c>0</c> if you don't have more than one graphics card.
  50.        ''' </param>
  51.        ''' ----------------------------------------------------------------------------------------------------
  52.        ''' <returns>
  53.        ''' The resulting <see cref="System.Drawing.Image"/>.
  54.        ''' </returns>
  55.        ''' ----------------------------------------------------------------------------------------------------
  56.        Public Shared Function TakeScreenshot(ByVal adapterIndex As Integer) As Image
  57.  
  58.            Dim factory As Factory1
  59.            Dim adapter As Adapter1
  60.            Dim device As Device
  61.            Dim output As Output
  62.            Dim output1 As Output1
  63.            Dim scrSize As Size
  64.            Dim textureDesc As Texture2DDescription
  65.            Dim screenTexture As Texture2D
  66.            Dim duplicatedOutput As OutputDuplication
  67.            Dim captureDone As Boolean = False
  68.            Dim capture As Bitmap = Nothing
  69.            Dim i As Integer = 0
  70.  
  71.            factory = New Factory1()
  72.            adapter = factory.GetAdapter1(adapterIndex)
  73.            device = New Device(adapter)
  74.            output = adapter.GetOutput(adapterIndex)
  75.            output1 = output.QueryInterface(Of Output1)()
  76.            scrSize = New Size(width:=CType(output.Description.DesktopBounds, SharpDX.Rectangle).Width,
  77.                               height:=CType(output.Description.DesktopBounds, SharpDX.Rectangle).Height)
  78.  
  79.            ' Create Staging texture CPU-accessible.
  80.            textureDesc = New Texture2DDescription() With {
  81.                .CpuAccessFlags = CpuAccessFlags.Read,
  82.                .BindFlags = BindFlags.None,
  83.                .Format = Format.B8G8R8A8_UNorm,
  84.                .Width = scrSize.Width,
  85.                .Height = scrSize.Height,
  86.                .OptionFlags = ResourceOptionFlags.None,
  87.                .MipLevels = 1,
  88.                .ArraySize = 1,
  89.                .SampleDescription = New SampleDescription With {.Count = 1, .Quality = 0},
  90.                .Usage = ResourceUsage.Staging
  91.            }
  92.            screenTexture = New Texture2D(device, textureDesc)
  93.            duplicatedOutput = output1.DuplicateOutput(device)
  94.  
  95.            While Not (captureDone)
  96.                Try
  97.                    Dim screenResource As DXGI.Resource = Nothing
  98.  
  99.                    Dim duplicateFrameInformation As OutputDuplicateFrameInformation
  100.  
  101.                    ' Try to get duplicated frame within given time.
  102.                    duplicatedOutput.AcquireNextFrame(10000, duplicateFrameInformation, screenResource)
  103.  
  104.                    If (i > 0) Then
  105.                        ' Copy resource into memory that can be accessed by the CPU.
  106.                        Using screenTexture2D As Texture2D = screenResource.QueryInterface(Of Texture2D)()
  107.                            device.ImmediateContext.CopyResource(screenTexture2D, screenTexture)
  108.                        End Using
  109.  
  110.                        ' Get the desktop capture texture.
  111.                        Dim mapSource As DataBox = device.ImmediateContext.MapSubresource(screenTexture, 0, MapMode.Read, MapFlags.None)
  112.  
  113.                        ' Create the bitmap.
  114.                        capture = New System.Drawing.Bitmap(scrSize.Width, scrSize.Height, PixelFormat.Format32bppArgb)
  115.                        Dim boundsRect As New System.Drawing.Rectangle(0, 0, scrSize.Width, scrSize.Height)
  116.  
  117.                        ' Copy pixels from screen capture Texture to GDI bitmap.
  118.                        Dim mapDest As BitmapData = capture.LockBits(boundsRect, ImageLockMode.WriteOnly, capture.PixelFormat)
  119.                        Dim sourcePtr As IntPtr = mapSource.DataPointer
  120.                        Dim destPtr As IntPtr = mapDest.Scan0
  121.  
  122.                        For y As Integer = 0 To (scrSize.Height - 1)
  123.                            ' Copy a single line.
  124.                            Utilities.CopyMemory(destPtr, sourcePtr, (scrSize.Width * 4))
  125.  
  126.                            ' Advance pointers.
  127.                            sourcePtr = IntPtr.Add(sourcePtr, mapSource.RowPitch)
  128.                            destPtr = IntPtr.Add(destPtr, mapDest.Stride)
  129.                        Next y
  130.  
  131.                        capture.UnlockBits(mapDest)
  132.                        device.ImmediateContext.UnmapSubresource(screenTexture, 0)
  133.                        captureDone = True
  134.                    End If
  135.  
  136.                    screenResource.Dispose()
  137.                    duplicatedOutput.ReleaseFrame()
  138.  
  139.                Catch e As SharpDXException
  140.                    If (e.ResultCode.Code <> DXGI.ResultCode.WaitTimeout.Result.Code) Then
  141.                        Throw e
  142.                    End If
  143.  
  144.                End Try
  145.  
  146.                i += 1
  147.  
  148.            End While
  149.  
  150.            If (duplicatedOutput IsNot Nothing) Then
  151.                duplicatedOutput.Dispose()
  152.            End If
  153.  
  154.            If (screenTexture IsNot Nothing) Then
  155.                screenTexture.Dispose()
  156.            End If
  157.  
  158.            If (output1 IsNot Nothing) Then
  159.                output1.Dispose()
  160.            End If
  161.  
  162.            If (output IsNot Nothing) Then
  163.                output.Dispose()
  164.            End If
  165.  
  166.            If (device IsNot Nothing) Then
  167.                device.Dispose()
  168.            End If
  169.  
  170.            If (adapter IsNot Nothing) Then
  171.                adapter.Dispose()
  172.            End If
  173.  
  174.            If (factory IsNot Nothing) Then
  175.                factory.Dispose()
  176.            End If
  177.  
  178.            Return capture
  179.  
  180.        End Function
  181.  
  182.    End Class
  183.  
  184. End Namespace

Ejemplo de uso:
Código
  1. Test.SharpDXUtil.TakeScreenshot().Save("C:\Screenshot.png")

PD: Creo no hace falta decirlo, pero por si acaso: Necesitas descargar la librería de SharpDX y para usar el código de arriba debes referenciar los siguientes ensamblados: SharpDX.dll, SharpDX.Direct3D11.dll, SharpDX.DXGI.dll y SharpDX.Mathematics.dll

Saludos
« Última modificación: 3 Julio 2016, 18:25 pm por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #23 en: 5 Julio 2016, 16:54 pm »

Disculpa la demora es que tuve problemas con el internet.

En cuanto llegue a casa lo pruebo.

Salu2 y millon de gracias.
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #24 en: 6 Julio 2016, 03:19 am »

Hola,

El código funciona genial mientras no me meta en un juego  :xD :xD

Me da un "access denaid" investigaré a ver que puede estar sucediendo.

Aqui te pongo una captura del error y te pongo la linea en la que ocurre.

Código
  1. duplicatedOutput = output1.DuplicateOutput(device)


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.813



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #25 en: 6 Julio 2016, 03:36 am »

Yo ahí no puedo intervenir, todo eso es controlado por SharpDX y es un problema específico (ya que a mi no me ocurre). De todas formas deduzco que ese código genérico HRESULT está indicando un acceso denegado al intentar leer o escribir en la memoria. Publica el problema en la sección de problemas de SharpDX en GitHub: https://github.com/sharpdx/sharpdx/issues

Saludos!
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #26 en: 6 Julio 2016, 16:49 pm »

Publicado, ahora resta esperar, mientras sigo con los remiendos usando FRAPS y simulando la tecla de F10. !

 :xD :xD :xD

No encuentro entre los ISSUES de alla nada relacionado con esto, me falto probar con las otras DLL's que viene en el mismo paquete quien sabe y si rula !

Salu2 y gracias !
En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
capturar juego
Juegos y Consolas
mrz 3 1,874 Último mensaje 4 Noviembre 2006, 11:46 am
por ¤ Nerviozzo ¤
Conoces este juego? A que nivel has llegado? El Juego mas dificil del mundo « 1 2 »
Juegos y Consolas
jdc 12 16,635 Último mensaje 28 Septiembre 2012, 22:46 pm
por Bomb-P
Hacer zoom en foto y que se vea mas agrandada esa parte de la foto solo
Diseño Gráfico
Anonymous250 3 4,958 Último mensaje 9 Agosto 2012, 17:54 pm
por Azielito
Capturar entrada y salida de paquetes(Juego Online)
Programación Visual Basic
ZylarD 1 2,044 Último mensaje 2 Septiembre 2013, 01:28 am
por 79137913
Capturar entrada y salida de paquetes(Juego Online)
Programación C/C++
ZylarD 1 3,415 Último mensaje 2 Septiembre 2013, 09:24 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines