Ayuda con problema Primer Plano en Ventana

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Ayuda con problema Primer Plano en Ventana

Post by BlackDraGoN » 09 Feb 2024, 15:31

Tengo un Script el cual lee un fichero "Inicio.txt" que contiene varias lineas como la siguiente:

;Tiempo espera en segundos | [minimizar, maximizar, normal] | [admin, user] | [top, normal] | ruta del programa a ejecutar.
5|maximizar|admin|top|C:\Windows\notepad.exe
5|normal|user|normal|C:\Windows\calc.exe

Mi problema es que no consigo hacer que algunos programas se pongan en primer plano cuando activo la opción TOP, a veces funciona y otras no, y no consigo saber porque. Os adjunto el codigo para que me podais decir algo.

Code: Select all

#NoEnv
#SingleInstance Force
SetTitleMatchMode 2
SendMode Input
SetWorkingDir %A_ScriptDir%

archivo := "inicio.txt"
last_top := ""


; Leer el archivo de instrucciones
IfExist, %archivo%
    FileRead, contenido, %archivo%
else
    MsgBox Fichero inicio.txt no localizado

; Dividir el contenido en líneas
lineas := []
lineas := StrSplit(contenido,"`n")

; Recorrer cada línea del archivo
for index, linea in lineas
{
    ; Eliminar espacios en blanco al principio y al final de la línea, el retorno y cambio de linea.
    linea := StrReplace(StrReplace(Trim(linea), "`r"), "`n")


    ; Saltar líneas vacías y líneas de comentario
    if (linea = "" or SubStr(linea, 1, 1) = ";")
        continue

    ; Dividir la línea en partes usando el carácter "|" como separador
    partes := StrSplit(linea, "|")


    ; Verificar si hay suficientes partes en la línea
    if partes.Length() < 5
    {
        MsgBox Error: La linea no contiene suficientes partes
        continue
    }

    ; Extraer los valores de la línea
    WinPid := ""
    tiempo_espera := partes[1] * 1000
    tamano := partes[2]
    administrador := (partes[3] = "admin") ? true : false
    top := (partes[4] = "top") ? true : false
    programa := partes[5]
    proceso := RegExReplace(programa, "m)^.+\\", "")
    
    ; Esperar durante el número de segundos indicados
    Sleep, %tiempo_espera%
    
    ; Ejecutar el programa
    if FileExist(programa)
    {
        Process, Exist, %proceso%
        if ErrorLevel
        {
            WinPid := ErrorLevel
            MsgBox Proceso o ya ejecutado
        }
        else
        {
            try
                if administrador {
                    if (tamano = "minimizar")
                        Run, *RunAs %programa%, , Min, WinPid
                    else if (tamano = "maximizar")
                        Run, *RunAs %programa%, , Max, WinPid
                    else
                        Run, *RunAs %programa%, , , WinPid
                } else {
                    if (tamano = "minimizar")
                        Run, %programa%, , Min, WinPid
                    else if (tamano = "maximizar")
                        Run, %programa%, , Max, WinPid
                    else
                        Run, %programa%, , , WinPid
                }
            catch
                 MsgBox Aplicacion no encontrada
        }
    }
    else
    {
        continue
    }

    ; Esperar a que el programa se inicie
    Process, Wait, %WinPid%, 10
    if !ErrorLevel
    {
       MsgBox Tiempo de espera finalizado
    }
    
    if top {
       WinWait, ahk_exe %proceso% ahk_pid %WinPid%, , 10        
       if ErrorLevel
       {
          MsgBox Tiempo de espera de la ventana finalizado         ;;;   <<<------------   ESTE MENSAJE CASI SIEMPRE ME LO SACA
       }
       WinActivate, ahk_pid %WinPid%
       last_top := Trim("ahk_exe " . proceso) . " " . Trim("ahk_pid " . WinPid)
    }
}

if (last_top <> "") {
    Loop, 10 
    {
        WinActivate, %last_top%      
        Sleep 5000
        IfWinActive, %last_top% 
        {
            break                                    ;;;  <<<<<-------------- CASI NUNCA ENTRA AQUI PARA PARAR EL LOOP
        }
        ;; Poniendo en primer plano
    }
}

IfWinNotActive, %last_top% 
{
    Click 10,10                                    ;;;;  <<<----------- ESTA HA SIDO SOLUCION, YA QUE AL ESTAR LA VENTANA LA PRIMERA LA PULSO PARA PONERLA EN PRIMER PLANO
}							;;;;  PERO ESTA SOLUCION ES UN POCO CHAPUZA

ExitApp

;;; Declaración de hotstrings
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Esc::       ; Captura Ctrl+Esc
    ExitApp
    return

Podeis decirme si uso bien los WinWait, WinActivate y el Process, son los que normalmente me dan el problema, pero ya he visto y repasado miles de veces.

Muchisimas gracias.

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Ayuda con problema Primer Plano en Ventana

Post by BlackDraGoN » 12 Feb 2024, 04:44

Ya encontre el problema, lo que me sucede es que al ejecutar el programa, este internamente llama a otro que tiene otro nombre de proceso, como puedo obtener el ID de un proceso que es llamado por otro??
Es decir, si yo ejecuto un programa, pero ese ejecuta otro, como puedo saber el ID del otro programa o como saber si ha llamado a otro??

Post Reply

Return to “Pedir Ayuda”