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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  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,990 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #10 en: 27 Junio 2016, 16:45 pm »

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.

La función Win32 DwmGetWindowAttribute no estaba incluida en la versión actual de ElektroKit en GitHub, ¡por eso te la enseñé aparte, para que la copiases directamente en tu código! xD. Tal vez me faltó eliminar el "Nativemethods." del ejemplo que te mostré para evitar esta confusión.

Simplemente elimina lo de "NativeMethods." y llama a la función DwmGetWindowAttribute que te mostré (TuClase.DwmGetWindowAttribute(...)).



En el primer codigo pones el Return a:
Código
  1. Return TakeScreenshotFromRegion(rc, includeMouse, pixelFormat)

Esto es correcto ??

Si, es correcto.

En la versión no-simplificada que usaste al principio (el código que sacaste de GitHub), TakeScreenshotFromObject y TakeScreenshotFromRegion hacian practicamente lo mismo, tenian una parte del código idéntica/duplicada, así que lo he refactorizado para que la función TakeScreenshotFromObject simplemente obtenga el Rectangle que debe pasarle a la función TakeScreenshotFromRegion para que se encarge del resto.



Ya he actualizado la librería de ElektroKit:

Disculpa la demora pero he tenido que modificar todos los archivos (casi 1.000) en esta actualización y me ha llevado varios días solamente para hacer eso.

PD: En GitHub puedes encontrar el código actualizado:

Saludos


« Última modificación: 27 Junio 2016, 17:02 pm por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #11 en: 27 Junio 2016, 19:12 pm »

Hola,

Código
  1. Os.Win10

Me da que no reconoce ese metodo, supongo que tengo que importar otra de las librerias quizas System o Core.

Dime si me equivoco asumo que esto verifica si el sistema es Windows 10 y entonces continua....

Esto lo puedo resolver de otra forma pero quiero estar seguro antes.

Salu2 y gracias


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #12 en: 27 Junio 2016, 19:34 pm »

Código
  1. Os.Win10
Me da que no reconoce ese metodo, supongo que tengo que importar otra de las librerias quizas System o Core.

Para usar la class "OS":
Código:
Imports Elektro.System.Tools.SystemInfo

Por cierto, lo siento mucho por las complicaciones o los mareos que veo que te estoy causando, jeje.



Dime si me equivoco asumo que esto verifica si el sistema es Windows 10 y entonces continua....

Esto lo puedo resolver de otra forma pero quiero estar seguro antes.

Efectivamente, pero te recomiendo usar ElektroKit para realizar esa comprobación, o al menos sacar el código relacionado y copiarlo/pegarlo en tu código, el cual por cierto ya te lo mostré en mi respuesta anterior...

Citar
Código
  1. Public Shared ReadOnly Property IsWin10() As Boolean
  2.    <DebuggerStepThrough>
  3.    Get
  4.        Return (Environment.OSVersion.Platform = PlatformID.Win32NT) AndAlso (InternalIsWin10())
  5.    End Get
  6. End Property
  7.  
  8. Private Shared Function InternalIsWin10() As Boolean
  9.  
  10.    Using reg As RegistryKey = Microsoft.Win32.Registry.LocalMachine.
  11.                               OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion", writable:=False)
  12.  
  13.        Dim productName As String = DirectCast(reg.GetValue("ProductName", "Error", RegistryValueOptions.None), String)
  14.        Return productName.StartsWith("Windows 10", StringComparison.OrdinalIgnoreCase)
  15.  
  16.    End Using
  17.  
  18. End Function

TEN CUIDADO si no sigues esta sugerencia y lo vas a intentar detectar manualmente con otro código distinto, se requiere una metodología especial como por ejemplo la que mostré mediante el registro.

Metodologías como por ejemplo el uso de la propiedad Environment.OSVersion , recurrir a WMI, o a la API GetVersion/GetVersionEx, son metodologías que están consideradas obsoletas y te darán resultados contradictorios, incluyendo las siguientes APIs de ayuda para detectar las versiones de Windows y de Windows 10 ...la cual primero necesita que la app tenga un manifiesto específico:
 

No existe una solución eficiente por parte de Microsoft ...por el momento.

Como ya digo, te recomiendo utilizar ElektroKit para evaluar la versión del OS, o lo que es lo mismo: ¡ese código de arriba!.

Saludos!
« Última modificación: 27 Junio 2016, 19:49 pm por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #13 en: 27 Junio 2016, 20:13 pm »

Aaaaaaaaaaaaaaa  :¬¬  :¬¬

Creo que el dios de la programacion me tiene odio GGG

Retifico...el post que hice hace nada por si ya lo habias leido.. me confundi de funcion te hablaba de la de "region" cuando era la de "object", de igual manera tampoco me funciono.

Incluso hice que iniciara minimizado y nada..

La fui depurando y toma el handle correctamente, detecta las dimensiones de la pantalla y nada tira la foto al escritorio.

Salu2

PD: Me imginaba que no seria tan sencillo ademas pensadolo bien si ya estoy importando las estructuras que mas da 2 DLL mas GGG asi lo hago todo nativo.

Nada de disculpas si yo soy el que te las tiene que pedir por chivarte tanto.

« Última modificación: 27 Junio 2016, 20:44 pm por TrashAmbishion » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #14 en: 27 Junio 2016, 21:13 pm »

No se como ayudarte más, lo he probado con varios juegos de Blizzard maximizados (fullscreen) y minimizados y me funciona correctamente (con el código aactualizado que ya te mostré), en mi caso se toma la foto del juego.

Dime que de que juego se trata o... pásame por privado el proyecto de Visual Studio para intentar depurarla a ver si tal vez la aplicación está ganando el foco y por eso no funciona o... ¡no se por qué!.

Saludos
« Última modificación: 27 Junio 2016, 21:17 pm por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #15 en: 29 Junio 2016, 15:54 pm »

Hola,

Disculpa la demora te comento que el juego es el Battle Field 3 es de shotting como supongo sabras y sino bueno ya lo sabes gggg.

Acabo de sentarme en un Pc con Windows 7 y probe el programa con un juego se llama Mahjong o algo asi que lo puedo poner pantalla completa y el codigo fue un éxito rotundo, ahora mismo voy a otro pc con windows 8 pero otra version diferente a la mia para probarlo y te contaré probare el mismo juego y otro mas que encuentre.

Te cuento los resultados.
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #16 en: 30 Junio 2016, 04:06 am »

Confirmado es en dependencia del tipo de juego..

Los minigames como dinerdash o cualquiera de esos del mago nico si funciona pero cuando juegas juegos mas potentes que asumo tenga que ver con el DirectX que es el q se mete por medio ya se chiva el codigo....

Alguna idea entonces con alguna de los proyectos que trabajan esa area..??

Salu2
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #17 en: 1 Julio 2016, 19:06 pm »

Confirmado es en dependencia del tipo de juego..

Tú mismo lo has dicho. El problema está en como trabaja/renderiza ese juego en específico, Battlefield 3 (y el resto de juegos que sean similares en ese sentido).

Lo he descargado para probarlo y lo primero que me he dado cuenta es que el juego no puede trabajar a una resolución nativa de 1920x1080px, sino que trabaja en una resolución bastante menor, y entonces cuando juegas en modo fullscreen el juego reescala hasta una resolución mayor. Esto es importante, y es lo que causa que no se pueda obtener una imagen real y al tamaño esperado, por que para reescalar la pantalla se vuelve negra o se queda una imagen estática de la ventana del juego antes de ponerlo en fullscreen. Si el juego trabajase a una resolución nativa igual que la de la pantalla, entonces la imagen al menos se tomaria a pantalla completa.

He probado varios capturadores de pantalla profesionales para intentar confirmar que realmente se trata del juego y no de mi algoritmo. Estos han sido los resultados:

Primero de nada, si estando dentro del juego pulsamos la tecla "Imprimir pantalla" para dejar que Windows tome la captura, este es el resultado:

( Una imagen a 1920x1080. La parte blanca imagino que es la superfie de renderizado que el juego no puede rellenar, al no trabajar a esa resolución. )

Esta imagen fue tomada con WinSnap, una captura de pantalla con retardo de 10 segundos, estando dentro del juego. Exactamente el mismo resultado que una captura de Windows:


Esta es una imagen tomada con ElektroKit, el resultado fue exactamente el mismo:


El código utilizado fue este:
Código
  1. Imports System.Drawing.Imaging
  2.  
  3. Imports Elektro.Application.Types
  4. Imports Elektro.Core.IO.Enums
  5. Imports Elektro.Imaging.Tools
  6.  
  7. Public NotInheritable Class Form1 : Inherits Form
  8.  
  9.    ' Fullscreen capture.
  10.    Friend WithEvents HotkeyScreenshotType1 As New Hotkey(HotkeyModifiers.None, Keys.D1)
  11.  
  12.    ' BF3 window capture.
  13.    Friend WithEvents HotkeyScreenshotType2 As New Hotkey(HotkeyModifiers.None, Keys.D2)
  14.  
  15.    Private Sub HotkeyScreenshotType1_Press(ByVal sender As Object, ByVal e As HotkeyPressEventArgs) _
  16.    Handles HotkeyScreenshotType1.Press
  17.  
  18.        Static imgIndex As Integer = 0
  19.        Dim path As String = String.Format(".\Fullscreen_{0:00}.png", Interlocked.Increment(imgIndex))
  20.  
  21.        Using screenshot As Image = ImageUtil.TakeScreenshotFromDesktop(includeMouse:=False)
  22.            screenshot.Save(path, ImageFormat.Png)
  23.        End Using
  24.        ' Process.Start(path)
  25.  
  26.    End Sub
  27.  
  28.    Private Sub HotkeyScreenshotType2_Press(ByVal sender As Object, ByVal e As HotkeyPressEventArgs) _
  29.    Handles HotkeyScreenshotType2.Press
  30.  
  31.        Static imgIndex As Integer = 0
  32.  
  33.        Dim name As String = "bf3"
  34.        Dim proc As Process = Process.GetProcessesByName(name).Single()
  35.        Dim hwnd As IntPtr = proc.MainWindowHandle
  36.        Dim path As String = String.Format(".\{0}_{1:00}.png", name, Interlocked.Increment(imgIndex))
  37.  
  38.        Using screenshot As Image = ImageUtil.TakeScreenshotFromObject(hwnd, includeMouse:=False)
  39.            screenshot.Save(path, ImageFormat.Png)
  40.        End Using
  41.        ' Process.Start(path)
  42.  
  43.    End Sub
  44.  
  45. End Class



No creo que pueda haber una solución "directa" a este tipo de problema. Sabiendo que la resolución nativa de ese juego es 1280x720px, lo único que se me ocurre que puedes hacer es recortar la imagen para eliminar la superficie o canvas blanco, y redimensionar la imagen cortada.

El siguiente código producirá esta imagen a 1920x1080p o la resolución que sea tu pantalla...:


Código
  1. Imports System.Drawing.Imaging
  2.  
  3. Imports Elektro.Application.Types
  4. Imports Elektro.Core.IO.Enums
  5. Imports Elektro.Imaging.Extensions.Image
  6. Imports Elektro.Imaging.Tools
  7.  
  8. Public NotInheritable Class Form1 : Inherits Form
  9.  
  10.    Friend WithEvents HotkeyScreenshot As New Hotkey(HotkeyModifiers.None, Keys.D0)
  11.  
  12.    Private Sub HotkeyScreenshot_Press(ByVal sender As Object, ByVal e As HotkeyPressEventArgs) _
  13.    Handles HotkeyScreenshot.Press
  14.  
  15.        Static imgIndex As Integer = 0
  16.  
  17.        Dim procName As String = "bf3"
  18.        Dim proc As Process = Process.GetProcessesByName(procName).Single()
  19.        Dim hwnd As IntPtr = proc.MainWindowHandle
  20.        Dim gameRes As New Size(1280, 720)
  21.        Dim scr As Screen = Screen.PrimaryScreen
  22.        Dim path As String = String.Format(".\{0}_{1:00}.png", procName, Interlocked.Increment(imgIndex))
  23.  
  24.        If (scr.Bounds.Width > gameRes.Width) AndAlso (scr.Bounds.Height > gameRes.Height) Then
  25.            Using screenshot As Image = ImageUtil.TakeScreenshotFromRegion(scr.Bounds, includeMouse:=True),
  26.                  cutted As Image = screenshot.Cut(gameRes.Width, gameRes.Height, 0, 0),
  27.                  resized As Image = cutted.Resize(scr.Bounds.Size)
  28.  
  29.                resized.Save(path, ImageFormat.Png)
  30.            End Using
  31.  
  32.        Else
  33.            Using screenshot As Image = ImageUtil.TakeScreenshotFromRegion(scr.Bounds, includeMouse:=True)
  34.                screenshot.Save(path, ImageFormat.Png)
  35.            End Using
  36.  
  37.        End If
  38.  
  39.        ' Process.Start(path)
  40.  
  41.    End Sub
  42.  
  43. End Class

Pero ese código de nada sirve ya que aun faltaría solucionar otro problema que no he sido capaz de lograr, ni Windows, ni el resto de capturadores profesionales: actualizar la imagen del juego.
 
Cuando quieras tomar una captura del juego, primero debes minimizar el juego y maximizarlo de nuevo para que se guarde una imagen (estática) del juego en ese preciso momento y la captura tome esa imagen, de lo contrario siempre tomará la misma imagen (si nunca restauraste la ventana del juego entonces no habrá imagen, será una imagen negra o blanca). Al parecer no es posible capturar una imagen real, sino la última imagen del juego cuando lo restauras de esta forma, no se si me explico, pero así es como funciona.

Saludos!
« Última modificación: 1 Julio 2016, 19:16 pm por Eleкtro » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 755


Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #18 en: 2 Julio 2016, 06:20 am »

Hola,

Joder bro no sabes cuanto te agradezco las molestias.

No se si habras usando el programa FRAPS es que el uso para hacer capturas y grabar video de los juegos en tiempo real y funciona muy bien.

Te cuento que si la captura las hace asi me sirve porque la mayoria de los cheaters usan AimBots que les hace señalizaciones en la pantalla y como veo la imagen a pequeña escala aqui asumo que cuando la tire yo aqui se vean bien con ese detalle del blanco que al final no es tan importante.

De todas formas lo voy a probar y te cuento..

Salu2 y muchisimas gracias desde ya..
« Última modificación: 2 Julio 2016, 06:54 am por TrashAmbishion » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Capturar Foto de Juego !!
« Respuesta #19 en: 2 Julio 2016, 15:11 pm »

No se si habras usando el programa FRAPS es que el uso para hacer capturas y grabar video de los juegos en tiempo real y funciona muy bien.

Es bueno saber que existe un programa que pueda hacerlo, intentaré investigar sobre la metodología que utiliza ese programa aunque es un programa de pago así que no creo que me digan nada al respecto :-/.

También me faltó probar otra cosa diferente; el wrapper de DirectX para .NET, SharpDX, tiene un ejemplo en GitHub para capturar imágenes, aunque no me lo he mirado detalladamente pero quizás esa sea la solución para poder tomar capturas de pantalla de juegos como este en fullscreen, quiero decir, con un algoritmo basado en DirectX.

https://github.com/sharpdx/SharpDX-Samples/blob/master/Desktop/Direct3D11.1/ScreenCapture/Program.cs

Cuando tenga un rato intentaré buscar una solución con todo eso.

Saludos
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,558 Ú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,919 Ú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,367 Último mensaje 2 Septiembre 2013, 09:24 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines