Página 1 de 3

Ayuda con Winlist()

Publicado: 14 Sep 2009, 19:02
por Jonny
Hola

Estoy intentando usar la función Winlist(), para saber que ventanas hay abiertas.

Hice esto:

Código: Seleccionar todo


$var=Winlist()

For $I=1 To $var[0][0] Step +1

If IsVisible($var[$I][1]) Then

Msgbox(0, "", $var[$I][0])

EndIf



Next

Func IsVisible($handle)

  If BitAnd( WinGetState($handle), 2 ) Then 

    Return 1

  Else

    Return 0

  EndIf



EndFunc

 
Funciona bien, pero no se por qué, me salen más ventanas de las que tengo realmente abiertas.

En mi caso ahora mismo, me salen 2 sin título y una de un programa que no tengo abierto. Quizá ésta última esté oculta, pero no debería aparecer con el filtro que he puesto en el for, con la función IsVisible que he sacado de la ayuda de WinList precisamente, que parece comprobar que la ventana que le pasemos (el handle) sea visible.
¿Alguien sabe como pulir esto para que únicamente aparezcan las ventanas que están realmente abiertas?
Gracias,

Salu2!

Re: Ayuda con Winlist()

Publicado: 14 Sep 2009, 21:08
por Jonny
Hola

He estado probando y probando con WinList. Parece, que ya se por qué me devuelve ventanas sin título.
Parece que esas ventanas, son tooltips. Bien que aparecen unos segundos y se quitan solos o de los que se quedan en la barra de herramientas (No he conseguido saber porque me aparecen ventanas que no están abiertas almenos visibles).

Se me ocurrió para comprobar si la ventana es un tooltip, que podría mirar el tipo de ventana, o algo parecido. Dí con la función WinGetClassList e hice lo siguiente (Idéntico a lo anterior):

Código: Seleccionar todo


$var=WinList()

For $I=1 To $var[0][0] Step +1

If IsVisible($var[$I][1]) Then

Msgbox(0, "", $var[$I][0]&@CRLF&WinGetClassList($var[$I][0]))

Else

ContinueLoop

EndIf

Next





Func IsVisible($handle)

  If BitAnd( WinGetState($handle), 2 ) Then 

    Return 1

  Else

    Return 0

  EndIf



EndFunc

 
No se si esta función servirá para determinar el tipo de ventana que es la actual (Recorriendo el array con un bucle), pero sí se que no entiendo ... nada.
Parece que me devuelve la clase de los controles que contiene la ventana ¿Verdad?
Por ejemplo.
Esto es lo que obtengo para "Mis documentos":
Mis documentos
WorkerW
ReBarWindow32
ToolbarWindow32
WorkerW
ToolbarWindow32
WorkerW
msctls_statusbar32
SHELLDLL_DefView
DUIViewWndClassName
DirectUIHWND
CtrlNotifySink
SysListView32
Pues eso. Solo entiendo "Mis documentos" jejeje.

Salu2!

Ver las ventanas de la barra de tareas de windows

Publicado: 15 Sep 2009, 00:57
por Chefito
Mmmmm....no lo estás enfocando del todo bien. Trabaja con la ToolBar de la barra de tareas de win, y los botones que contienen los títulos de las ventanas. Te dejo un pequeño ejemplo:

Código: Seleccionar todo

#Include <GuiToolBar.au3>

$hWnd=ControlGetHandle("[class:Shell_TrayWnd]","","ToolbarWindow322")

$numventanas=_GUICtrlToolbar_ButtonCount($hWnd)

for $n=0 To $numventanas

    $estadoBoton=_GUICtrlToolbar_GetButtonState($hWnd, $n)

    If Not(BitAND($estadoBoton,$TBSTATE_HIDDEN)) Then MsgBox(0,"",_GUICtrlToolbar_GetButtonText($hWnd,$n))

Next

 
Saludos.

Re: Ayuda con Winlist()

Publicado: 15 Sep 2009, 06:49
por Jonny
Hola

Gracias, éste si funciona...

Verás, lo que pretendía hacer, es, ya que he conseguido que funcione la detección de Alt+Tab que comentábamos en otros post, anticiparme a Windows.
Sabeis, que cuando pulsamos ese hotkey, no se produce el cambio de ventana hasta que no se sueltan ambas teclas ¿Verdad?
Lo que pretendía, era, antes de soltarlas saber a que ventana se iba a cambiar. Como deduje que hacer eso mediante apis ... iba a ser muy complicado, sinó imposible, pensé que teniendo un array con las ventanas abiertas sería tan sencillo como esperar al hotkey que produce el cambio de ventana en Windows y una vez pulsado comprobar la ventana activa, buscarla en el array y ver cual era la siguiente. De esa manera, podría conseguir saber que ventana se enfocará antes de liverar el hotkey...
Con el código que me has puesto, quizá también podría, pero no coincide el órden en que aparecen las ventanas, con el que conmuta Windows al pulsar Alt+Tab.

Salu2!

Re: Ayuda con Winlist()

Publicado: 15 Sep 2009, 22:52
por Jonny
Hola

He estado probando con todas las funciones habidas y por haber jeje, y no doy con la forma de acceder a la ventanita que aparece al pulsar Alt+Tab, para ahí comprobar que aplicación está seleccionada (antes de soltar ambas teclas) que es lo que quería hacer.
He intentado ver el título de ventana, controles que tiene, clase, etc, pero no devuelve nada ninguna de las funciones que he utilizado.
¿Se os ocurre como tratar esta ventanita?
Gracias,

Salu2!

Re: Ayuda con Winlist()

Publicado: 16 Sep 2009, 08:31
por Ximorro
¿Pero sólo quieres capturar ALT+TAB o quieres impedir que se cambie de aplicación de cualquier manera?
Lo digo porque cambiar de ventana se puede hacer de otras maneras, lógicamente pinchando con el ratón (tanto en la ventana como en el botón de la barra de tareas) pero también por ejemplo desde el administrador de tareas.

Si lo que quieres es impedir el cambio de ventana (aunque no me parece muy buena idea, te puedes quedar "encerrado" en na aplicación)creo que lo mejor será poner una especie de monitor que vea cada cierto tiempo (poco, medio segundo, por ejemplo) qué ventana está activa, y actuar en consecuencia, cambiando otra vez a la que había antes, a otra prefijada o lo que sea que quieras hacer.

El problema con esto es que sí se cambiará de ventana y luego se "descambiará", y el usuario lo ve todo, la ventaja es que es un método común para todas las maneras de cambiar de ventana... te ahorras tanta complicación de ver lo del teclado, la ventanita esa del ALT+TAB, etc...

Re: Ayuda con Winlist()

Publicado: 16 Sep 2009, 16:50
por Jonny
Hola
No, no jeje... No pretendo impedir que pueda cambiarse de aplicación.

Lo único que pretendo, es, detectar el Alt +Tab para saber que la ventanita esa donde aparecen los iconos de las aplicaciones abiertas está activa.
Apartir de ahí, pretendo únicamente saber sobre que icono está el foco del teclado, es decir, al pulsar Tab, saber que aplicación está marcada. Pensando un poco, se me ha ocurrido que quizá pueda conseguirlo con un código que hizo Chefito a modo de ejemplo, para algo similar que necesitaba.
http://www.emesn.com/autoitforum/viewto ... f=3&t=1747

En ese post, necesitaba saber que elemento del escritorio (Por ejemplo) estaba seleccionado. Supongo que adaptando un poco el código, para que funcione en la ventana activa y no solo en el escritorio, obtendré el resultado que pretendo en este caso.

Salu2!

Re: Ayuda con Winlist()

Publicado: 16 Sep 2009, 20:16
por Jonny
Hola

Pues nada ... Toda la tarde probando y probando y no hay manera.
Para Autoit o Windows, lo que quiera que sea, no es una ventana lo que aparece al pulsar el Alt Tab.
He intentado con todas las funciones. WinGetHandle, WinGetTitle, nada. Me devuelven siempre resultados sobre la última ventana que tenía activa. Mis Documentos por ejemplo...
Pero, curiosamente, como dige WinList() sí lo reconoce como ventana.¿Alguien tiene idea de como hacer esto?
Lo que tenía pensado, de comprobar el icono seleccionado con el código de Chefito del post que puse arriba, no funciona, al no detectarse la ventana.

¿Podría hacerse usando las funciones Pixel?

Salu2!

Re: Ayuda con Winlist()

Publicado: 17 Sep 2009, 09:43
por Ximorro
Con las funciones pixel sería extremadamente complicado... ¿qué harías, una analizador de imágenes para ver qué icono es?

Pero SÍ es una ventana, rara, pero ventana. El programa Au3Info que viene con AutoIt me dice que es de clase #32771, pero ¡no dice nada más!, no tiene nombre, ninguna información sobre los controles que tiene dentro (igual no tiene nada y lo dibujan todo a pelo...)

Así que al menos la ventana igual la cazas con WinWaitActive("[CLASS:#32771]", ""), aunque ni idea de cómo controlar lo de dentro...

Encima, no es por fastidiar, pero a lo mejor sólo funciona en tu S.O., si por ejemplo en Vista se usa el modo ese que queda tan bonito con los TABS en 3D, seguramente no funcionará... :smt017

EDITADO: ¡Funciona!, se puede capturar con [CLASS:#32771], ¡pero la ventana no se activa! así que hay que usar WinWait, en vez de WinWaitActive, si te fijas cuando usas ALT+TAB la ventana que estaba activa sigue estándolo.

Por ejemplo:

Código: Seleccionar todo

$res = WinWait("[CLASS:#32771]", "", 10)

If $res = 1 Then

    MsgBox(0, "OK", "ALT+TAB activado")

Else

    MsgBox(0, "Time-out", "ALT+TAB no detectado en 10 segundos")

EndIf

 
Prefiero enviar ese tipo de mensajes a la consola pero no sé si la manejas, si te has pasado ya a Scite no hay problema, si no tienes que irte a una ventana de DOS. En este caso el MsgBox sale en cuanto sale la ventana del ALT+TAB, pero sale detrás y puede que no lo veas inmediatamente.

Ahora el problema es encontrar los controles que hay dentro, Au3Info no da ninguna pista...

Re: Ayuda con Winlist()

Publicado: 17 Sep 2009, 11:25
por Ximorro
En este post del foro inglés hay un programita para listar los controles que hay dentro de una ventana. Me temo que para la del AltTab sale vacía... :smt011

Re: Ayuda con Winlist()

Publicado: 17 Sep 2009, 17:23
por Jonny
Hola

Pues hasta ahí llegué. Con ayuda de WinList(), que como dige es la única función que al parecer reconoce la ventanita, obtube su handle y así la clase. Me pregunto ¿No existirán, o podrían existir más ventanas con esa clase?
Lo digo, porque de ser así, podrían haber comportamientos inesperados en la aplicación que haga ¿no?

He mirado el código del post inglés. ¿Es para listar los elementos de una ventana dices, no?
¿Miraste el código de Chefito que puse más arriba?
es diferente, te dice que elemento está bajo el foco del teclado ¿No podría servir eso?
He de probar. aunque, si las funciones que lleva el código no admiten handles o la clase de la ventana para referirse a ella ... chungo.

A ver si consigo algo, aunque está bastante complicado, pues hay poco con lo que trabajar.

Por cierto.

¿Sabeis algo de la msaa?

me han comentado que el SDK de Windows lleva alguna api para trabajar con ella. Aunque tiene que ser ... para echarse a temblar, quizá ¿Fuera más sencillo tratar esto con esas apis?
Yo no encontré nada, ni en el foro inglés, ni en Google...
En cualquier caso, si puede solucionarse con funciones de Autoit, ¡mucho mejor!.

Salu2!

Re: Ayuda con Winlist()

Publicado: 17 Sep 2009, 18:55
por Jonny
Hola.
Tanto de lo mismo. No consigo acceder a la info de la maldita ventanita. Pero, sí he encontrado el código fuente de un programa que hace justo, lo qe necesito.
¿Problema? está escrito en Piton (de lo que evidentemente no tengo ni papa). Además analizar todo un programa ... puede ser como poco, para morirse.
Os dejo el link, por siacaso os animais a echarle un vistazo:
http://svn.nvda-project.org/nvda/trunk/source/
Ni si quiera se en que archivo estará lo que necesito, pero es seguro que al pulsar alt tabulador lee mediante una síntesis de voz los iconos de la dichosa ventanita, además de decir el número del elemento. 1, 2, 3...
La idea de buscar esto, era intentar ver como lo hacen los creadores del programa, e intentar portarlo a autoit. Porque viendo el código de esa parte de la aplicación, podríamos almenos saber que leches hace la ventanita (dibujar los iconos a pelo, o que), que por otra parte, no creo que sea así...

Salu2!

Re: Ayuda con Winlist()

Publicado: 18 Sep 2009, 09:02
por Ximorro
Lo de existir más ventanas con ese nombre de clase no es imposible pero sí sería pero que muy raro, y más con el nombre que le han dado.

El código de chefito era muy específico para la ventana del escritorio, donde los iconos se sabe que están en un control de tipo ListView (bueno yo no lo sabía lo acabo de aprender :smt002 )

Pero en este caso no tenemos (o no sabemos encontrar) un control similar de donde sacar esos iconos o textos.

Yo sí creo que están dibujando los iconos y textos a pelo, pues me parece muy raro que las funciones que te dicen qué control está debajo del ratón no vean nada (vaya, lo que usa AutoIt Wnidow Info). Eso es al estilo de ventanas java, por ejemplo, que como se "inventan" sus propios controles el Windows sólo ve que es una ventana, pero no ve que dentro haya botones, porque para Windows eso son simples dibujos...

Muy interesante lo de python. No tengo ni idea de Python y he ido esperanzado a mirar el código por "si suena algo", ¡¡¡pero es como muy grande, con mogollón de ficheritos!!!. Si al menos supiéramos dónde mirar. Sospecho que no mira los controles de la ventana, sino que a través de alguna API o mirando alguna "variable interna" de Windows se sabe qué está haciendo la dichosa ventanita.

Una esperanza, porque si se puede hacer con Python, otro lenguaje interpretado, además multiplataforma, seguramente también se puede hacer con AutoIt, que está aún más pensado para trabajar con Windows...

Re: Ayuda con Winlist()

Publicado: 18 Sep 2009, 12:31
por Jonny
Hola

Realmente, yo también he aprendido lo del escritorio gracias a Chefito.

Pues voy a acabar pensando que sí, que efectivamente Windows dibuja a pelo el contenido de esa ventana. Lo que no me cuadra, es el por qué lo hace con esa y no con las demás, por ejemplo el escritorio, que paradójicamente antes de que Chefito hiciera ese código para acceder a los iconos de éste, pensaba que sería mucho más complicado (Tanto como lo está siendo para detectar esta ventana (alt tab)), pues pensaba que Windows dibujaría el escritorio a pelo y cual es mi sorpresa, que es al revés jeje.

Yo también pensé que sería más sencillo rebuscar en el código de ese programa y veo que efectivamente es ... complicado sin saber Piton. Pero efectivamente, me dió una pequeña esperanza, pensar que si un programa escrito en un lenguaje interpretado y multiplataforma, como dices es capaz de hacerlo, Autoit también tiene que serlo. Lo de utilizar alguna api o similar lo había pensado, pero no se ni por donde empezar a buscar... Más que nada, porque al poner algo como "Alt Tab" en Google, aparecen montañas de páginas, donde te ponen para descargar un programa que justo se llama así, que al parecer toca esa ventanita precisamente (para cambiarle la apariencia) o algo así.

En cualquier caso, creo, que con las funciones de Autoit no hay nada que hacer para ésto, pues he mirado todas y cada una de ellas (relacionadas con ventanas) y pese a haber muchas que podrían servir no funcionan, porque no detectan nada.

Salu2!

Re: Ayuda con Winlist()

Publicado: 18 Sep 2009, 13:30
por Ximorro
Pues no creas, buscando "alt tab 32771" te encuentras alguna página donde intentan tocarla y las que he visto coinciden en que los controles se dibujan "a pelo". Al final lo que hacen los que "modifican" esa ventana es en realidad reemplazarla del todo, capturan el ALT+TAB y dibujan su propia ventana. La original o está detrás de la suya o en realidad esta desactivada, aunque eso no sé cómo se hace.

No veo que nadie modifique la ventana original, quizás haya que buscar más en San Google...

Re: Ayuda con Winlist()

Publicado: 18 Sep 2009, 16:41
por Jonny
Hola

¡Puff!
Si acceder a los elementos de la ventana es difícil, no quiero imaginarme como tiene que ser impedir que salga, para reemplazarla por otra jeje.
Digo yo
¿No podrían servir las funciones gráficas de Autoit?

Salu2!

Re: Ayuda con Winlist()

Publicado: 19 Sep 2009, 03:47
por Chefito
Bueno bueno.....ya veo que os está costando :smt024 . No he podido participar antes porque estaba de curso.
Exactamente que quereis hacer???
Anular la salida de la ventana puñetera (he visto por ahí que la llaman conmutador de tareas ALT+TAB de Windows)??? Eso es facil....de forma indirecta :smt002 :smt047 .
También he realizado un pequeño script que dice las ventanas que tienes abiertas con el mismo orden que lo dice la ventana alt+tab. Es un poquitín chapucero, pero parece que funciona bien :smt047 .
Al mezclar las dos cosas me ha hecho cosas raras. Tendría que depurar un poco más el código e incluso hacer alguna triquiñuela.
Creo que se podría hacer una ventana conmutador de tareas a medida parecida a la que sale, pero propia (con los iconos de los programas y todo :smt003 ).
Pero he intentado otra cosa que me ha dado algo más por saco, que creo que lo pedías en otro post. Es activar directamente la ventana siguiente a la activa sin que te salga la ventana conmutador.
A ver si tengo tiempo y sigo investigando :smt024 .

Saludos.

Re: Ayuda con Winlist()

Publicado: 19 Sep 2009, 22:00
por Jonny
Hola

Exactamente, quiero saber que icono de la ventanita que sale al pulsar el alt+tab está marcado ¿Podrá hacerse esto? jeje.
La idea es detectarlo, para pasárselo a eci.dll ¿Os suena también verdad?
Quizá al principio me hice un poco de taco... Pero lo que quiero es saber que icono está seleccionado (igual que con el ejemplillo que hiciste para detectarlo en el escritorio), de forma que al pulsar tabulador y cambie el icono seleccionado en la ventanita, detectarlo con Autoit (igual que con el ejemplo del escritorio se detecta cuando se pone el foco sobre otro icono distinto al seleccionado)...
Gracias,

Salu2!

Re: Ayuda con Winlist()

Publicado: 21 Sep 2009, 08:02
por Ximorro
Pues mira con lo de la lista de ventanas en orden del ALT+TAB lo puedes solucionar. Juntando eso con el control de teclado para ver los ALT+TAB presionados sabes qué ventana va seleccionando...

Re: Ayuda con Winlist()

Publicado: 22 Sep 2009, 14:14
por Jonny
Hola

¿Como lo harías?

No se me ocurre la forma, porque el órden varía según vamos enfocando las ventanas.

Por ejemplo, podemos tener abiertas la ventana 1, 2 y 3
en principio supongamos que están en ese órden. Pero si hacemos alt+Tab dos veces, estando enfocada la ventana 1 se marcaría la ventana 3 para enfocarse si soltáramos el hotkey (puesto que ventana 3 es la última que tenemos abierta) ¿Verdad?
Si ahora hacemos alt tab una sola vez, enfocaremos "Ventana 1",, pues "Ventana 2" ha quedado como la última ventana, (Tendríamos que pulsar Alt+Tab dos veces para llegar a ella).

Si nos basamos en el órden de las ventanas abiertas, no se exactamente como funcionará (Hasta que Chefito no cuelgue algún ejemplo) pero si no se puede de alguna forma actualizar esa info, no coincidiría en muchos casos.

Salu2!