Saber cuando se pone en primer plano un formulario

Iniciado por icisneros, 21 Agosto 2007, 11:06 AM

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

icisneros

Necesito saber cuando ponen mi formulario en primer plano.

Si cargan mi programa y luego van a la barra de tareas y maximizan otra ventana, quiero saber cuando vuelven a pulsar sobre mi formulario de nuevo, cuando vuelven a activar mi ventana.

He probado con gotfocus y activate, pero esos eventos no se producen. Conoceis el evento?

Un saludo!

Kizar

Yo he probado los eventos y ninguno hace lo que quieres, lo que se me ocurre es con un timer llamar a la api "GetForegroundWindow" que te da el handle de la ventana activa y lo comparas con el de tu ventana "Me.hWnd" si coincide esta activa.

icisneros

El evento activate sólo detecta los cambios de ventana dentro de la misma aplicación, para vb 2005 ya está solucionado y detecta tambien los cambios entre diferentes aplicaciones.

Tendré que plantearme usar un timer para poder detectar eso.

Gracias KiZaR

Un Saludo

Kizar

La propiedad "Resize" te vale para cuando maximizan y minimizan tu ventana, pero si esta visible y pulsas en la barra de tareas no hace nada....

LeandroA

hola puedes hacer un gancho con hook

en un modulo:

Const WM_ACTIVATEAPP = &H1C

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Dim PrevProc As Long
Public Sub HookForm(F As Form)
    PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
    SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)


    If uMsg = WM_ACTIVATEAPP Then
        If wParam Then
            Debug.Print "Activate"
        Else
            Debug.Print "Deactivate"
        End If
    End If
End Function



y en el formulario:


Private Sub Form_Load()
    HookForm Me
End Sub

Private Sub Form_Unload(Cancel As Integer)
    UnHookForm Me
End Sub