Pues esa misma, mirando $WS_CAPTION mi ventana "Recuadro" hace que se líe.
Respecto a las funciones ya definidas en el UDF está más que claro que lo que hacen es EXACTAMENTE lo que haces tú con la llamada a la DLL, simplemente te lo comentaba porque es fácil que se te haya pasado, y aunque la funcionalidad lógicamente es la misma, así es más cómodo escribir la llamada, sólo era por eso.
En realidad aquí hay dos temas diferentes:
a) hacer un intercambiador de tareas
tipo ALT+TAB
b) saber exactamente qué ventana tiene seleccionada el ALT+TAB de Windows, que es lo que realmente quiere Jonny
El caso (a) ya lo has solucionado, sólo falta activar la ventana correspondiente. En realidad ya está solucionado porque podemos PASAR de la pesadilla que es la selección de ventanas por ALT+TAB de Windows y usar
el orden que nos dé la gana, decidiendo nosotros qué hacemos con las TOPMOST, las TOOLWINDOW y compañía. Siempre que tengamos una ventana seleccionable podemos hacerlo según nuestro criterio, da igual cómo lo haga Windows.
El caso (b) es casi imposible, por dos cosas: primero en cada versión de Windows cambia, por ejemplo he leído que en algunos Vista sólo se comporta como en XP para las 6 ventanas más recientes, las demás las pone alfabéticamente por path o por tipo (por ejemplo todos los explorer juntos). La segunda cosa chunga son los bugs de ALT+TAB, que son los que nos están volviendo locos, porque la caga cuando hay ventanas TOOLWINDOW, que no las muestra pero hace que se equivoque al seleccionar la segunda ventana (por eso a veces se selecciona la primera). Además he leído que a veces no tiene claro el z-order cuando minimizas una aplicación (desapacecen ventanas de la lista que en el siguiente ALT+TAB vuelven a aparecer), y hay aplicaciones "tramposas" que se colocan las segundas aunque las minimices, según he leído pasa bastante con Outlook y a veces con Office (qué casualidad).
De todas maneras voy tomar tu "gancho teclado" y voy a hacer una versión de lo que debería ser la selección de ventanas ALT+TAB sin tener en cuenta por ejemplo esos bugs de la ventana minimizada o las tramposas. Intentaré reproducir el de las ventanas TOOLWINDOW pero ya veremos.
Cuento la idea que tengo en la cabeza por si Jonny quiere ponerse, que si no no aprenderá
Creo que esto se parecerá bastante a lo que hace ALT+TAB, por lo que he estado leyendo por la web, no lo he comprobado todo 100%, eso lo haré cuando me ponga a hacer el programa, pero eso no será ahora mismo...
ALT+TAB
en principio simplemente usa el z-orden de las ventanas para ordenarlas, eso lo tomamos de Chefito con lo de tomar ventanas a partir de "Program Manager" (no se me habría ocurrido en la vida).
Las ventanas TOOLWINDOW deben ser ignoradas y no se ponen en la lista de ventanas seleccionables (en realidad tenemos que tenerlas en cuenta para reproducir el bug de la primera ventana seleccionada, de eso hablamos luego)
PERO resulta que las ventanas TOPMOST siempre están primero en la lista.
Así que por un lado se ordenan las TOPMOST y por otro las normales, al final se juntan las dos listas poniendo primero las TOPMOST.
Por ejemplo si el z-orden de las ventanas que denoto por letras es A B C D E F G, pero resulta que C, E y F son TOPMOST, entonces el orden para ALT+TAB es C E F A B D G. Pero si en ese caso, además, resultaba que B y F son TOOLWINDOW, entonces el resultado final sería C E A D G. Ojo porque una TOOLWINDOW puede ser TOPMOST, en ese caso también desaparece de la lista.
Mi idea es
no usar la estructura de Chefito que va mirando las ventanas en cada TAB. Si os fijáis las ventanas seleccionables y su orden se hace la primera vez que se pulsa ALT+TAB, a partir de ahí cada TAB va pasando por esas ventanas cíclicamente. Así que mi idea es elaborar esa lista (metiéndola en un array donde cada valor es un hWnd), teniendo en cuenta lo que he puesto en los párrafos anteriores, de golpe y una sóla vez cuando ALT+TAB también la crea. Tomando la fantástica idea de Chefito eso sería cuando la ventana #32771 aún no ha aparecido, donde él iniciaba $auxOnTop, $hwnd y $EmpezarSegundo, yo ahí generaría el vector de los $hwnd ya ordenadito por Z-order, poniendo primero los TOPMOST, e ignorando los TOOLWINDOW (ver al final las consideraciones sobre el bug)
Después, el bucle principal ya no sería un bucle, sería simplemente
Código: Seleccionar todo
Si $codigo=9 Entonces
coger siguiente hwnd del vector (o volver al primero si ya hemos llegado al final)
mostrar su icono y texto
FinSi
Con este código mucho más simple (lo complicado estará en el
If Not(WinExists("[CLASS:#32771]"))) podemos incluso pensar en hacer el SHIFT+ALT+TAB, que recorre la lista al revés... aunque no sé cómo mirar en KeyProc el SHIFT+TAB... Simplemente sería ir hacia atrás por el vector de los hwnd.
EL BUG:
Esta es la parte que más hay que investigar si queremos emular exactamente ALT+TAB. El orden de las ventanas parece casi seguro que es el que pongo arriba (en XP, ojo), además en principio siempre habría que empezar seleccionando la segunda ventana (la primera será la que tenemos activa, y ALT+TAB pasa primero a la que usamos anteriormente a esa). El problema con los TOOLWINDOW creo que es que sí los tiene en cuenta al seleccionar esa segunda ventana, pero como luego desaparecen de la lista a veces el segundo se convierte en el primero (por ejemplo si la primera era TOOLWINDOW, al desaparecer la segunda, que estaba seleccionada, ahora está la primera).
Esto habrá que mirarlo con más detenimiento, pero adelanto que ponerse a reproducir bugs de otros puede ser muy complicado...
Hala Jonny ya me dirás.
Y si hacemos una selección de ventanas elegante a lo mejor hasta la usa Chefito