Capturar ventana

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Capturar ventana

Mensaje por chekok »

Buenos días compañeros. Un saludo a todos.

Necesito hacer una captura de pantalla de una ventana concreta y no encuentro la manera de hacerlo. He estado repasando la ayuda y el foro y no he encontrado nada al respecto.

He estado mirando la función _ScreenCapture_CaptureWnd de la UDF ScreenCapture.au3 pero no consigo el resultado esperado.

Código: Seleccionar todo

#include <ScreenCapture.au3>
_Main()
Func _Main()
Local $ventana = 0x0001039A
_ScreenCapture_CaptureWnd("C:\captura\img_ventana.jpg", $ventana)
EndFunc
El código sería correcto, pero me encuentro con un problema, el Handle de la ventana. Resulta que la ventana que quiero capturar está dentro de otra ventana y con el Au3info el handle que me da es el de la ventana padre, haciéndome la captura de la ventana padre y la hija que contiene, pero yo solo necesito capturar la ventana hija para luego imprimir dicha imagen.

Alguna sugerencia al respecto?
La vida es larga y dura.
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Capturar ventana

Mensaje por chekok »

Se me ha ocurrido tomar las coordenadas de la ventana y el tamaño, ya que siempre se abre en el centro de la pantalla, leyendo de un ini el tamaño de la ventana que genera la aplicación.

El código quedaría tal que así:

Código: Seleccionar todo

#include <ScreenCapture.au3>
_Main()
Func _Main()
   Local $x, $y, $ancho, $alto
   Local $ventana = 0x000204E0
   $ancho = IniRead ( "recuento.ini", "posicion", "ancho", 0)
   $alto = IniRead ( "recuento.ini", "posicion", "alto", 0)
   $x = (@DesktopWidth / 2) - ($ancho /2)
   $y = (@DesktopHeight / 2) - ($alto /2)
   MsgBox(0,"",$ancho & " " & $alto & " " & $x & " " & $y)
   _ScreenCapture_CaptureWnd("C:\capturas\img_ventana.jpg", $ventana, $x, $y, $ancho, $alto)
EndFunc
Pero aun dándole las coordenadas y tamaños a la función tal como pone en la ayuda, me sigue capturando la pantalla completa del equipo.
¿Por qué? ¿Qué estoy pasando por alto?
La vida es larga y dura.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Capturar ventana

Mensaje por Ximorro »

¿Pero es una ventana Child normal de Windows? ¿o una subventana dibujada y gestionada totalmente por el programa?

Prueba a ver mi capturador en modo ventana y en modo objeto.
La verdad es que el modo ventana no sé si capturará las ventanas child o la principal...
Si en modo objeto te reconoce la subventana se podría hacer por ese sistema.
http://www.emesn.com/autoitforum/viewto ... f=5&t=1848
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Capturar ventana

Mensaje por chekok »

Va de cine tu apli Ximorro.

He probado los distintos métodos y solo funciona con el método objeto.

¿Cual sería el procedimiento?
La vida es larga y dura.
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Capturar ventana

Mensaje por Jonny »

No se si he entendido bien lo que quieres.

¿Capturar una ventana, cómo?. ¿Como si se hiciera un printscreen?.

Si es así (que lo que quieres es capturar una imagen de una ventana, sin necesidad de manipular sus controles ni nada ¿por qué no envías directamente un "imprimir pantalla"?. Con Send() supongo que podrías hacerlo, conociendo el código de esa tecla que no se de memoria y no se si con algo como "print screen" funcionaría. Por supuesto luego, el trabajo será recuperar el contenido del portapapeles, que es donde "imprimir pantalla" guarda la imagen.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Capturar ventana

Mensaje por Ximorro »

Jonny que eso ya lo tiene superado, lo que quiere es seleccionar automáticamente esa región.

En mi programa lo hago buscando el control que hay bajo el cursor. Básicamente el código sería este. Hago recorte de mi programa espero no dejarme nada importante:

Código: Seleccionar todo

$mPos = _WinAPI_GetMousePos()
$posObj = WinGetPos(_WinAPI_WindowFromPoint($mPos))
; Traducimos ancho y alto a coordenadas
$posObj[2] = $posObj[0] + $posObj[2]
$posObj[3] = $posObj[1] + $posObj[3]
; $concursor vale true si se captura cursor de ratón y/o teclado
$Hbit = _ScreenCapture_Capture("", $posObj[0], $posObj[1], $posObj[2], $posObj[3], $concursor)
Claro que yo usaba la posición del ratón para buscar el control, si tiene que ser totalmente automático tendrás que dar una coordenada de por ejemplo la barra de título de la subventana, aunque lo mejor sería identificar el control por nombre o clase.
Ten cuidado que puede haber controles dentro de controles, si das las coordenadas de un botón dentro de la subventana te capturará sólo el botón, por eso digo lo buscar una coordenada en la barra de título.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
chekok
Hacker del Foro
Mensajes: 111
Registrado: 16 Sep 2011, 11:50
Ubicación: Valencia / España
Contactar:

Re: Capturar ventana

Mensaje por chekok »

Muchas gracias Ximorro. :smt023

Voy a probar a ver si lo consigo. :smt024
La vida es larga y dura.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Capturar ventana

Mensaje por Ximorro »

Ah por cierto, que si tienes que poner las coordenadas "a mano" en vez de sacarlas del ratón como hago yo, hay que tener en cuenta que $mpos es de tipo POINT, una estructura de dos enteros.
Para asignar por ejemplo las coordenadas 300,44 se haría
$mpos = DllStructCreate("int X; int Y")
DllStructSetData($mpos , "X", 300)
DllStructSetData($mpos , "Y", 44)


Por supuesto se pueden usar variables en vez de constantes.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder