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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  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 13,994 veces)
TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Capturar Foto de Juego !!
« en: 21 Junio 2016, 09:09 am »

Hola,

Estuve viendo que hay una forma q es lidiando con DirectX pero Electro en su SDK lo demuestra de otra manera (la cual toy mirando, por cierto si estas leyendo alguna posibilidad de obtener el codigo pa no importar la DLL es por tema de peso final del App los creditos siempre se mantendran)

Gracias cualquier ayuda


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #1 en: 21 Junio 2016, 10:35 am »

Hola

En el repositorio de SharpDX (el wrapper más completo de la API de DirectX para .NET) tienes un ejemplo para lo que parece ser un capturador de imágenes:

Ahora, no puedo darte información más precisa por que no utilizo SharpDX ...bueno, en realidad si, pero para cosas muy básicas que nada tienen que ver, así que es como si no lo usase.

De todas formas, SharpDX/DirectX siempre se hace tedioso de usar en caso de que no tengas demasiada experiencia en el tema (como es mi caso xD), y en ese caso yo no te lo recomendaría para una tarea que debería llevarse a cabo de forma simple. Con los métodos de captura de imagen de ElektroKit debería ser suficiente y no deberías tener problemas al usarlos.



alguna posibilidad de obtener el codigo pa no importar la DLL es por tema

Supongo que ya lo sabrás, pero lo digo de todas formas: GitHub tiene un buscador para encontrar código dentro de un repositorio. Úsalo la próxima vez...

Código
  1. <SuppressUnmanagedCodeSecurity>
  2. <DllImport("user32.dll")>
  3. Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr
  4. ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  5. End Function
  6.  
  7. <SuppressUnmanagedCodeSecurity>
  8. <DllImport("user32.dll", SetLastError:=True)>
  9. Public Shared Function ShowWindow(ByVal hwnd As IntPtr,
  10.    <MarshalAs(UnmanagedType.I4)> ByVal nCmdShow As WindowState
  11. ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  12. End Function
  13.  
  14. <SuppressUnmanagedCodeSecurity>
  15. <DllImport("user32.dll", SetLastError:=True)>
  16. Public Shared Function GetWindowRect(ByVal hwnd As IntPtr,
  17.                               <Out> ByRef rect As Rect
  18. ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  19. End Function

+

Código
  1. Public Enum WindowState As Integer
  2.    Normal = 1
  3. End Enum

+


+

Código
  1. Public Shared Function TakeScreenshotFromObject(ByVal hwnd As IntPtr, ...) As Image
  2.    ' ...
  3. End Function

o también:
Código
  1. Public Shared Function TakeScreenshotFromRegion(ByVal rect As Rectangle, ...) As Image
  2.    ' ...
  3. End Function

Saludos


« Última modificación: 21 Junio 2016, 10:56 am por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #2 en: 22 Junio 2016, 00:23 am »

Compadre ayer yo juraría que el

Código
  1.  
  2.    Public Shared Function TakeScreenshotFromRegion(ByVal rect As Rectangle, ...) As Image
  3.        ' ...
  4.    End Function
  5.  
  6.  

Me había funcionado ahora siempre me capturan el escritorio y no la pantalla del juego como tal.

Salu2 y gracias
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #3 en: 22 Junio 2016, 07:51 am »

Me había funcionado ahora siempre me capturan el escritorio y no la pantalla del juego como tal.

Hola.

Si no he entendido mal, dices que te captura la región completa del escritorio en lugar de la región de la ventana del juego?, entonces probablemente le estés pasando valores que no corresponden a la ventana del juego.

En el momento en que vayas a llamar a la función, depura el código para revisar que esos valores sean correctos, examinando los autos con un breakpoint, o en tiempo de ejecución:

Código
  1. Dim rc As Rectangle = ...
  2. Debug.WriteLine(String.Format("[Rectangle] Location: {0} Size: {1}", rc.Location.ToString(), rc.Size.ToString()))

Si los valores son incorrectos, podrías publicar el código para intentar ayudarte a encontrar el fallo con el intento de captura. De lo contrario, si estás seguro que los valores son correctos, podrías intentar publicar un código que yo pueda reproducir desde aquí para solucionar algún posible bug con mi función, aunque en un principio no debe haber ninguno, es una metodología simple y administrada por el GDI+ de .NET.

Saludos
« Última modificación: 22 Junio 2016, 08:08 am por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #4 en: 23 Junio 2016, 05:38 am »

Hola,

Bueno estuve mirando detenidamente tu codigo hace un rato y me di cuenta de que en la función tu mandas activar la ventana pasandole el handle previamente obtenido y bueno como yo tengo el juego maximizado no en modo ventana me parece que es ahi la cuestión, no obstante minimize el juego y ejecute el codigo y Buala funciono me activa la ventana toma la foto y se vuelve a minimizar, asi que la cosa esta ahi toy dandole vueltas para ver como modificarlo si tienes alguna solución al vuelo te lo agradecer aun mas.

Salu2
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #5 en: 23 Junio 2016, 06:27 am »

Bueno estuve mirando detenidamente tu codigo hace un rato y me di cuenta de que en la función tu mandas activar la ventana pasandole el handle previamente obtenido y bueno como yo tengo el juego maximizado no en modo ventana me parece que es ahi la cuestión, no obstante minimize el juego y ejecute el codigo y Buala funciono me activa la ventana toma la foto y se vuelve a minimizar, asi que la cosa esta ahi toy dandole vueltas para ver como modificarlo si tienes alguna solución al vuelo te lo agradecer aun mas.

Te refieres a esta función que toma un handle de ventana: TakeScreenshotFromObject(IntPtr, ...)

Pero según habias dicho, tu estás utilizando esta otra función que toma un Rectangle: TakeScreenshotFromRegion(Rectangle, ...)

¿En que quedamos? :P

Son códigos bastante diferentes entre sí. Por favor aclárame exactamente que función estás llamando si la del Handle o la del Rectangle, e intentaré reproducir el problema en otro juego maximizado. ¡Gracias por tu tiempo!.

PD: En caso de que te refieras a la función TakeScreenshotFromObject(IntPtr, ...), tal vez con comprobar si la ventana es visible y/o está maximizada sea suficiente para solucionarlo, al evitar esa llamada Win32 de ShowWindow ...que podría ser el problema.

Saludos
« Última modificación: 23 Junio 2016, 06:34 am por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #6 en: 23 Junio 2016, 18:53 pm »

 :o

Dios toy tonteando pues si se me olvido aclararte esa parte de que con la funcion:

Código
  1. TakeScreenshotFromRegion(Rectangle, ...)

No me funciona pues tira la foto al escritorio y no al juego como tal lo voy a depurar en cuanto llegue a la casa y te cuento los valores que tiene.

Y con:

Código
  1. TakeScreenshotFromObject(IntPtr, ...)

Por ahi sería la cosa pero da igual si no llamo a esa funcion me tira la foto al escritorio de igual manera no obstante sigo probando.

Salu2
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #7 en: 24 Junio 2016, 10:02 am »

Efectivamente he podido reproducir el error, habia un fallo con la función TakeScreenshotFromObject(IntPtr, ...), aunque es un fallo debido al código no administrado con la función ShowWindow, algo extraño que no he llegado a comprender del todo por qué motivo sucede ...para ser sinceros.

He reemplazado la metodología para evitar que se produzca ese extraño comportamiento, y lo he perfeccionado para soportar las ventanas con bordes invisible típicas de Windows 10, y también ventanas que puedan estar tapadas por el area no-cliente del escritorio (ej. la barra de tareas).



¿Estás usando las .dll de ElektroKit, o copiaste solo el código que necesitas?. Si necesitas que actualice la librería en GitHub para que puedas descargas las .dll con estos cambios ya aplicados, dímelo.

(el resto del código necesario está en namespace Elektro.Interop.Win32)
Código
  1. Public Shared Function TakeScreenshotFromObject(ByVal hwnd As IntPtr,
  2.                                                Optional ByVal includeMouse As Boolean = False,
  3.                                                Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format32bppArgb) As Image
  4.  
  5.    If Not NativeMethods.IsWindow(hwnd) Then
  6.        Throw New ArgumentException(paramName:="hwnd", message:="The specified handle doesn't point to a win32 Window.")
  7.        Return Nothing
  8.    End If
  9.  
  10.    ' Restore and give focus to a minimized window.
  11.    If NativeMethods.IsIconic(hwnd) Then
  12.        NativeMethods.OpenIconicWindow(hwnd)
  13.    End If
  14.  
  15.    ' Show a non-activated window and bring the window to z-top.
  16.    Dim wndPlacement As WindowPlacement
  17.    NativeMethods.GetWindowPlacement(hwnd, wndPlacement)
  18.    Select Case wndPlacement.ShowCmd
  19.  
  20.        Case Elektro.Interop.Win32.Enums.WindowState.Minimize, Elektro.Interop.Win32.Enums.WindowState.ForceMinimize,
  21.             Elektro.Interop.Win32.Enums.WindowState.ShowMinimized, Elektro.Interop.Win32.Enums.WindowState.ShowMinNoActive
  22.            NativeMethods.ShowWindow(hwnd, Elektro.Interop.Win32.Enums.WindowState.Restore)
  23.  
  24.        Case Elektro.Interop.Win32.Enums.WindowState.Hide
  25.            ' Avoid restoring a hidden window, just because the user didn't demanded this.
  26.            If Not NativeMethods.IsWindowVisible(hwnd) Then
  27.                Throw New ArgumentException(paramName:="hwnd", message:="The specified window it's hidden.")
  28.                Return Nothing
  29.            End If
  30.  
  31.        Case Else
  32.            NativeMethods.SetForegroundWindow(hwnd)
  33.  
  34.    End Select
  35.    NativeMethods.BringWindowToTop(hwnd)
  36.  
  37.    Dim rc As Win32.Types.Rect = GetRealWindowRect(hwnd)
  38.    Dim scr As Screen = Screen.FromHandle(hwnd)
  39.    rc = Rectangle.Intersect(rc, scr.WorkingArea)
  40.    Return TakeScreenshotFromRegion(rc, includeMouse, pixelFormat)
  41.  
  42. End Function

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Gets the (non-client) <see cref="Rectangle"/> of a window.
  4. ''' <para></para>
  5. ''' This method supports a borderless <c>Windows 10</c> window.
  6. ''' </summary>
  7. ''' ----------------------------------------------------------------------------------------------------
  8. Private Shared Function GetRealWindowRect(ByVal hwnd As IntPtr) As Rectangle
  9.  
  10.    Dim rc As Win32.Types.Rect = Rectangle.Empty
  11.  
  12.    If IsWin10 Then
  13.        Dim hResult As Integer
  14.        hResult = NativeMethods.DwmGetWindowAttribute(hwnd, Elektro.Interop.Win32.Enums.DwmWindowAttribute.ExtendedFrameBounds, rc, Marshal.SizeOf(rc))
  15.        If (DirectCast(hResult, HResult) <> Elektro.Interop.Win32.Enums.HResult.S_OK) Then
  16.            Marshal.ThrowExceptionForHR(hResult)
  17.        End If
  18.  
  19.    Else
  20.        Dim result As Boolean
  21.        Dim win32Err As Integer
  22.        result = NativeMethods.GetWindowRect(hwnd, rc)
  23.        win32Err = Marshal.GetLastWin32Error()
  24.        If Not (result) Then
  25.            Throw New Win32Exception(win32Err)
  26.        End If
  27.  
  28.    End If
  29.  
  30.    Return rc
  31.  
  32. End Function

+

Código
  1. <SuppressUnmanagedCodeSecurity>
  2. <DllImport("dwmapi.dll", SetLastError:=False)>
  3. Public Shared Function DwmGetWindowAttribute(ByVal hwnd As IntPtr,
  4.                                             ByVal attribute As DwmWindowAttribute,
  5.                                             ByRef refAttribute As Rect,
  6.                                             ByVal sizeAttribute As Integer
  7. ) As Integer
  8. End Function

+

Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Gets a value that determines whether the current operating system is <c>Windows 10</c>.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. Public Shared ReadOnly Property IsWin10() As Boolean
  7.    <DebuggerStepThrough>
  8.    Get
  9.        Return (Environment.OSVersion.Platform = PlatformID.Win32NT) AndAlso (InternalIsWin10())
  10.    End Get
  11. End Property
  12.  
  13. Private Shared Function InternalIsWin10() As Boolean
  14.  
  15.    Using reg As RegistryKey = Microsoft.Win32.Registry.LocalMachine.
  16.                               OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion", writable:=False)
  17.  
  18.        Dim productName As String = DirectCast(reg.GetValue("ProductName", "Error", RegistryValueOptions.None), String)
  19.        Return productName.StartsWith("Windows 10", StringComparison.OrdinalIgnoreCase)
  20.  
  21.    End Using
  22.  
  23. End Function

Saludos
« Última modificación: 24 Junio 2016, 10:08 am por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #8 en: 24 Junio 2016, 18:52 pm »

Un crack  ;-) ;-) ;-)

Había copiado el codigo para hacerlo lo mas independiente posible no obstante estoy pensando poner la libreria y despues hago un joiner con una herramienta que es para los NET no recuerdo ahora la tengo por ahi, en caso futuro necesite añadirle algo eso lo veo despues.

Muchas gracias again !!
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #9 en: 25 Junio 2016, 04:04 am »

Hola,

El único comando que no me reconoce es:

Código
  1. NativeMethods.DwmGetWindowAttribute

Me dice que no es un miembro de NativeMethods, baje la ultima version de la DLL y nada me sigue diciendo lo mismo.

En el primer codigo pones el Return a:

Código
  1. Return TakeScreenshotFromRegion(rc, includeMouse, pixelFormat)

Esto es correcto ??

Salu2 y gracias de antemano !!
« Última modificación: 27 Junio 2016, 03:26 am por TrashAmbishion » 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,853 Ú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,561 Ú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,920 Ú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,015 Ú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,368 Último mensaje 2 Septiembre 2013, 09:24 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines