Page 1 of 1

Obtener Identificador Ventana

Posted: 03 Oct 2023, 04:04
by BlackDraGoN
Me gustaria saber si lo siguiente seria correcto.

Code: Select all

Identificador_Ahk := ""

Run, %App% %Parametros%, , , Identificador_Ahk

WinGet, Identificador_Ahk, ID, ahk_id %Identificador_Ahk%
Identificador_Ahk .= ahk_id %Identificador_Ahk%

;Espero 5 segundos a que se abra la pantalla, sino espero a que el proceso del ejecutable exista.
WinWait, Identificador_Ahk, , 5
if ERRORLEVEL
	Process, Wait, %App%, 5

........
........
Tengo un codigo con en el cual llamo a varias Apps, estoy usando WinWait, ahk_exe %App% pero no siempre me funciona, asi que quiero obtener el ID y usarlo,¿¿ lo de antes seria correcto, o que opcion me aconsejais??, tambien he usado Process, pero necesito que sea cuando la Ventana aparece, en caso de no aparecer, entonces uso Process, ya que hay algunas Apps que no generan Ventana.

Re: Obtener Identificador Ventana

Posted: 04 Oct 2023, 04:36
by BlackDraGoN
@sofista puedes ayudarme y decirme si hay otra forma mejor de hacer esto??

Re: Obtener Identificador Ventana  Topic is solved

Posted: 04 Oct 2023, 18:47
by sofista
Lo que noto a primera vista es que en esta línea:

Code: Select all

Identificador_Ahk .= ahk_id %Identificador_Ahk%
se hace una concatenación .= en vez de una asignación :=, cuando entiendo —o mejor dicho, supongo— que se busca esto último.

Prueba del error:

Code: Select all

run, notepad.exe
WinGet, Identificador_Ahk, ID, A    ; la ventana activa
Identificador_Ahk .= ahk_id %Identificador_Ahk%

if (Identificador_Ahk = ahk_id %Identificador_Ahk%)
	MsgBox yes
else
	MsgBox no

; MsgBox informa "no"
; Prueba de la asignación

Identificador_Ahk := ahk_id %Identificador_Ahk%

if (Identificador_Ahk = ahk_id %Identificador_Ahk%)
	MsgBox yes
else
	MsgBox no

; MsgBox informa "si"
Convendría, entonces, eliminar esa asignación que en realidad no hace nada y trabajar con el hwnd obtenido en primera instancia. Probemos a ver qué pasa:

Code: Select all

run, notepad.exe
WinGet, Identificador_Ahk, ID, A    ; la ventana activa

WinWait, ahk_id %Identificador_Ahk%,, 5
if ERRORLEVEL {
	MsgBox, Se ha producido un error
	return    ; se termina el script y el siguiente MsgBox no se nuestra
}

MsgBox, No hubo error    ; se muestra este mensaje

Re: Obtener Identificador Ventana

Posted: 05 Oct 2023, 01:23
by BlackDraGoN
sofista wrote:
04 Oct 2023, 18:47
Lo que noto a primera vista es que en esta línea:

Code: Select all

Identificador_Ahk .= ahk_id %Identificador_Ahk%
se hace una concatenación .= en vez de una asignación :=, cuando entiendo —o mejor dicho, supongo— que se busca esto último.
Perdona, es que al escribir no me di cuenta, realmente tengo la asignación :=

Prueba del error:

Code: Select all

Convendría, entonces, eliminar esa asignación que en realidad no hace nada y trabajar con el [c]hwnd[/c] obtenido en primera instancia. Probemos a ver qué pasa:

[code]
run, notepad.exe
WinGet, Identificador_Ahk, ID, A    ; la ventana activa

WinWait, ahk_id %Identificador_Ahk%,, 5
if ERRORLEVEL {
	MsgBox, Se ha producido un error
	return    ; se termina el script y el siguiente MsgBox no se nuestra
}

MsgBox, No hubo error    ; se muestra este mensaje
Una de mis preguntas es WinGet, Identificador_Ahk, ID, A precedido de un Run siempre va a devolver el ID del Run, se active o no la ventana del Run?? Si ejecuto el Run minimizado tambien devuelvera su ID?

Mil gracias de nuevo.

Re: Obtener Identificador Ventana

Posted: 05 Oct 2023, 06:54
by sofista
BlackDraGoN wrote:
05 Oct 2023, 01:23
Una de mis preguntas es WinGet, Identificador_Ahk, ID, A precedido de un Run siempre va a devolver el ID del Run, se active o no la ventana del Run?? Si ejecuto el Run minimizado tambien devuelvera su ID?
WinGet, Identificador_Ahk, ID, A devuelve el ID de la ventana activa. Ahora bien, si la ventana activa es minimizada deja de estar activa, por lo tanto, el comando WinGet devolverá el ID de la ventana activa anterior. Podrías haber ganado tiempo y autorrespondido con un test, por ejemplo:

Code: Select all

Run, notepad.exe,, Min
WinGetActiveTitle, varTitle    ; se guarda el título de la ventana activa
MsgBox, % varTitle             ; la ventana activa no es "Sin título: Bloc de notas"
Agregado: Este script obtiene el Hwnd de una ventana minimizada, quizás sea útil para tu proyecto.