Siendo 3 preguntas bien diferenciadas quizás habría sido mejor ponerlas en diferentes entradas, eso ayudaría a otros usuarios cuando busquen el mismo problema. Bueno, vamos allá:
a) ¿Ejecutar una carpeta? Las carpetas no se ejecutan exactamente, quizás te refieras a saber si está abierta en un explorador de Windows. En ese caso se puede hacer buscando la lista de ventanas de explorador (ventanas de clase
ExploreWClass, al menos en mi XP) y mirando por ejemplo en la barra de título qué carpeta tiene cada una...
Para obtener la lista de ventanas de esa clase se usa
WinList(("[CLASS:ExploreWClass]"), junto a los manejadores de ventana esta función te da los títulos así que los puedes mirar directamente.
Pero si por ejecutar te refieres a cualquier momento en el que un programa abre la carpeta para ver sus archivos la cosa es bastante más difícil. Seguramente a través del sistema de archivos se puede averiguar qué archivos están abiertos y por quién, pero me temo que no sé cómo se hace, habría que buscar por la MSDN porque seguro que eso se hace a base de llamadas a las API de Windows...
b) Parece que quieres extraer el último nombre de carpeta, con lo que la pregunta no es buscar la segunda barra ¡si no la última!. Si es así hay que especificar bien las cosas porque buscar la segunda es mucho más fácil que la última, pues no sabemos cuántas hay y hay que buscarlas todas.
La cosa es buscar esa barra y tomar lo que hay de string a partir de esa posición por ejemplo con
StringRight, o quizás con
StringMid.
Para buscar la barra yo lo haría con
StringInStr , el caso es que me suena haber leído que en la nueva versión de AutoIT se puede empezar a buscar por el final. Si es ese el caso simplemente busca el primero por la derecha y con esa posición cortas el string original.
Si estoy equivocado y no se puede buscar por el final es más complicado, tienes que ir haciendo búsquedas sucesivas hasta que no encuentres más, cada búsqueda se inicia desde la posición de la última. Cuando no se encuentran más la encontrada en la búsqueda anterior es la última barra... Si tienes que hacerlo así y te hace falta ayuda lo dices.
Probablemente también se puede hacer con expresiones regulares...
Hum, mirando la ayuda me acabo de encontrar con la función
_PathSplit en
file.au3, quizás sirva para lo que quieres, este ejemplo te mostrará "carpeta3":
Código: Seleccionar todo
#include <file.au3>
Global $szDrive, $szDir, $szFName, $szExt
$TestPath = _PathSplit("C:\carpeta1\carpeta2\carpeta3", $szDrive, $szDir, $szFName, $szExt)
MsgBox(0, "Última carpeta", $szFName)
Lo que hago es mostrar el nombre de archivo encontrado en el path, aunque en este caso sea una carpeta.
c)
No puedes, no exactamente eso. O estás en un while o en el otro, pero tienes dos opciones:
1) Usar el mismo
while que el que comprueba los eventos, dentro de ese
while tienes un
switch (o un
select) que mira lo que te ha dado
GuiGetMsg, pues pon tu código después del
EndSwitch pero dentro del
while.
2) Usar otra manera de ver los eventos que no requiere que estés mirándolos directamente dentro de un while. Se activa con
Opt("GUIOnEventMode", 1), después hay que asignar a cada control o evento general una función que se activará cuando se active dicho control o evento (con
GUICtrlSetOnEvent y
GUISetOnEvent, respectivamente).
De esta manera cuando se produzca uno de esos eventos la ejecución normal del programa es interrumpida donde esté y salta instantáneamente a la función asignada, cuando acaba dicha función reanuda el programa donde lo había dejado.
Espero que todo esto te sirva de algo, ve probando y si tienes problemas haz consultas más concretas (¡si es con código de ejemplo mejor!)
Saludooooos