Detectar regreso a la aplicación

Iniciado por seba64, 2 Abril 2020, 06:59 AM

0 Miembros y 1 Visitante están viendo este tema.

seba64

Estoy buscando la manera de detectar cuando la ventana recupera el foco. Por ejemplo el usuario está utilizando la aplicación y de pronto cambia al explorador de archivos o un navegador de internet o va a consultar un dato en una planilla de excel, pero después vuelve a la aplicación. Necesito detectar cuando esto sucede para realizar una acción. estoy utilizando visual basic 6, en estos momentos.

Si alguien sabe como hacerlo se lo agradecería mucho.

Serapis


Es una de las 'penas' de VB6, dichos eventos (Gotfocus y LostFocus) en el form están pensados exclusivamente para cuando se opera con aplicadones MDI, entonces dichos eventos saltan cuando se alterna entre ventanas MDIChild, para evitar confusión debieron llamarlos: GotDocusMDIChild y LostFocusMDIChild o algo similar...

Además dichos eventos están entrelazados con los eventos Activate y Deactivate, es decir no ocurren ni antes ni después de estos.
Hay un par de maneras, la larga es subclasificar para leer el mensaje que activa la ventana y derivarlo al evento deseado.

La otra forma es bastante más breve, y todavía asequible... usando una simple API, que nos devuelve el handle de la ventana que interactúa con el usuario en dicho instante.
Básicamente lo que haremos será chequear, cuando es nuestra ventana la que gana o pierde dicha atención, lo que equivale al resltados de tales eventos, aunque de un modo chapucero (no hay otra, salvo que quieras meter chorrocientas líneas para subclasificar los mensajes que reciba la ventana).

Coloca un control timer en el formulario pon a 100 su intervalo (100 milisegundos), luego con experiencia puedes decidir elevar dicho valor...
Código (vb) [Seleccionar]



Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Focus As Boolean




Private Sub Form_GotFocus()
    ' aqui tu codigo: cuando gana el foco
   
    Debug.Print "Gotfocus " & Rnd      ' solo para probar...
End Sub

Private Sub Form_LostFocus()
    ' aqui tu codigo: cuando pierde el foco.
   
    Debug.Print "Lostfocus " & Rnd     ' solo para probar...
End Sub


Private Sub Form_Load()
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    If (Me.hWnd = GetForegroundWindow) Then
        If (Focus = False) Then
            Focus = True
            Call Form_GotFocus
        End If
    Else
        If (Focus = True) Then
            Focus = False
            Call Form_LostFocus
        End If
    End If
End Sub


Para probarlo tienes que mostrar la ventana de debug (ventana 'Inmediato') desde el menú ver, o bien pulsando CTRL+G durante la ejecución al menos...

BlackZeroX

#2
Si es posible pero al igual que en C/C++ en VB6 hay que usar WinAPI

https://stackoverflow.com/questions/15756386/vb6-wh-getmessage-message-hook

Cuando identifiques el mensaje WM_ACTIVATE (https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-activate) puedes identificar que esta activa tu ventana.

Usa el buscador y busca sobre Hook en VB6 hay mucho de esto.

Saludos.

The Dark Shadow is my passion.

Danielㅤ

Hola, si es posible, aunque nunca he programado en VB, pero para lograr lo que deseas tenés que crear tu propio evento.

Lo que tenés que hacer es crear por ejemplo una función y a ésta ejecutarla apenas inicia tu programa usando Threads, ésta misma función lo que tendrá que hacer es tener un timer repetitivo cada por ejemplo 100, 200, 300, 400 o 500 milisegundos, eso ya vos lo decidis, luego de ese timer habría un condicional que compruebe si tú programa tiene la ventana activa y en caso de que si la tenga, entonces el bucle vuelve otra vez a hacer la misma comprobación, ahora si no devuelve tu programa como ventana activa, es porque el usuario cambio de ventana, y ahí podes usar una variable global que contenga por ejemplo lo siguiente:

ventanaActiva = False

cuando esa variable se setea a False, haces lo que quieras hacer y volves a setear esa misma variable en True.

Obviamente tu programa apenas inicie debe crear la variable ventanaActiva con valor True.

Se me acaba de ocurrir lo comentado y debería de funcionar, pruebalo y nos comentas.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!