Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: icisneros en 21 Agosto 2007, 11:06 am



Título: Saber cuando se pone en primer plano un formulario
Publicado por: icisneros en 21 Agosto 2007, 11:06 am
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!


Título: Re: Saber cuando se pone en primer plano un formulario
Publicado por: Kizar en 21 Agosto 2007, 11:44 am
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.


Título: Re: Saber cuando se pone en primer plano un formulario
Publicado por: icisneros en 21 Agosto 2007, 11:51 am
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


Título: Re: Saber cuando se pone en primer plano un formulario
Publicado por: Kizar en 21 Agosto 2007, 12:06 pm
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....


Título: Re: Saber cuando se pone en primer plano un formulario
Publicado por: LeandroA en 21 Agosto 2007, 14:31 pm
hola puedes hacer un gancho con hook

en un modulo:
Código:
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:

Código:
Private Sub Form_Load()
    HookForm Me
End Sub

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