Página 1 de 1

duda sobre ventana inactiva

Publicado: 02 Oct 2011, 20:22
por grzn
buenas compañeros, estoy aprendiendo esto de autoit, y mi duda seria si es posible enviar teclas a una ventana inactiva o minimizada, esto es lo que tengo hasta ahora, y funcionando como quiero, la duda es esa, es posible enviar a una ventana inactiva?

Código: Seleccionar todo

$x = 0
While 1
    If Mod($x, 12)  = 0 Then ; tab
        send("{TAB}")
    EndIf

    If Mod($x, 2)  = 0 Then ; 1
        send("{1}")
    EndIf

	If Mod($x, 1)  = 0 Then ; 3
        send("{3}")
    EndIf
	
	If Mod($x, 1)  = 0 Then ; 6
        send("{6}")
    EndIf
	
    If Mod($x, 6)  = 0 Then ; mp
        send("{2}")
    EndIf
	
	If Mod($x, 180)  = 0 Then ; hp
        send("{5}")
    EndIf

        Sleep(2000)
    $x += 1
WEnd

Re: duda sobre ventana inactiva

Publicado: 03 Oct 2011, 09:42
por Ximorro
Hola grzn, bienvenido.

Con Send mandas teclas como si las estuvieras presionando tú en el teclado, así que la manera fácil de ver si funciona es pensar si funcionaría si lo estuvieras escribiendo tú.
Así que normalmente Send no va a funcionar con ventanas que no están activas, pues el teclado va a la ventana (y control) que tiene el foco.
La único que se capturaría serían los HotKey, por ejemplo si tienes un programa de captura de video que empieza a grabar con "F11", por ejemplo, pues con un Send("{F11}") empezará a grabar, aunque el programa no tenga el foco.
Pero eso es porque se ha establecido un HotKey, si no, las teclas Send van siempre a lo que tiene foco.

Dicho esto, sí se puede enviar teclas a ventanas/controles que no tienen foco. Para ello hay que mandar las teclas directamente al control, se hace con ControlSend, donde identificas el control en el que quieres escribir.
Con esta función en principio no hay problema en enviar teclas a ventanas no activas o incluso minimizadas, pero no es seguro 100% si está minimizado, especialmente para controles creados con el propio programa AutoIt que está enviando las teclas recomienda que tenga el foco primero, de lo contrario podría no funcionar.

No sé si te sirve en este caso pero es bueno saber que hay otra función para escribir el texto de un control, esta vez sin simular el teclado, pone el texto directamente, es la función ControlSetText. Funciona de manera similar a ControlSend, identificando el control.