Visual Basic - Detectar cuando la ventana obtiene el foco

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 37
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Detectar cuando la ventana obtiene el foco

Publicado por seba64 (26 intervenciones) el 02/04/2020 06:04:55
Saludos:

Estoy buscando la manera de detectar cuando la ventana recupera el foco. Y es que visual basic no lo detecta, 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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 37
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Detectar cuando la ventana obtiene el foco

Publicado por seba64 (26 intervenciones) el 02/04/2020 17:30:41
He visto algunos ejemplos que hay aquí y en otras web, que muestran los procesos en ejecución y ejemplos que muestran a que aplicaciones se hace click. Esto es lo más cercano que he encontrado, pero el retorno del foco a mi ventana no necesariamente implica cliquear el formulario. Como puedo saber cual aplicación tiene el foco?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha disminuido 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Detectar cuando la ventana obtiene el foco

Publicado por seba64 (26 intervenciones) el 02/04/2020 19:57:36
Encontré este ejemplo en este sitio que me ayudo a lograr el "DETECTAR CUANDO LA VENTANA OBTIENE EL FOCO"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Option Explicit
 
'Constantes
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
 
' funciones Api
Private Declare Sub SetWindowPos Lib "User32" ( _
                ByVal hWnd As Long, _
                ByVal hWndInsertAfter As Long, _
                ByVal X As Long, _
                ByVal Y As Long, _
                ByVal cx As Long, _
                ByVal cy As Long, _
                ByVal wFlags As Long)
 
'Función que recupera el texto de la ventana
Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" _
               (ByVal hWnd As Long, _
                ByVal lpString As String, _
                ByVal cch As Long) As Long
 
' Recupera el Hwnd de la ventana
Private Declare Function GetForegroundWindow Lib "User32" () As Long
 
Private Sub Form_Load()
 
Me.FontSize = 10
Timer1.Interval = 300
'Esto es para que quede el formulario OnTop
Call SetWindowPos(Me.hWnd, HWND_TOPMOST, _
             0, 0, 500, 100, _
             SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE)
End Sub
 
Private Sub Timer1_Timer()
 
Dim hwnd_Ventana As Long
Dim Caption_Ventana As String
Dim length As Long
 
    ' Captura el Hwnd de la ventana activa
    hwnd_Ventana = GetForegroundWindow()
 
    'Crea un Buffer para el caption del title bar
    Caption_Ventana = Space$(1024)
 
    ' Retorna la cantidad de caracteres
    length = GetWindowText(hwnd_Ventana, Caption_Ventana, Len(Caption_Ventana))
 
    ' Obtiene solo el caption sin los espacios nulos de la cadena
    Caption_Ventana = Left$(Caption_Ventana, length)
    Me.Cls
    'Imprime el caption de la ventana que tiene el foco en el _
     formulario y el HWND
    Me.Print "HWND: -> " & CStr(hwnd_Ventana)
    Me.Print "Título: -> " & Caption_Ventana
 
End Sub

Agregué una variable ventanaPrevia y cambié todo lo que había en el timer por esto:

1
2
3
4
5
Private Sub Timer1_Timer()
	hwnd_Ventana = GetForegroundWindow()
	If hwnd_Ventana <> ventanaPrevia And hwnd_Ventana = Me.hWnd Then MsgBox ""
	ventanaPrevia = hwnd_Ventana
End Sub

y justo entonces cuando termine de escribir el código, me di cuenta que a mi no me sirve, porque mi proyecto tiene varios formularios (más de 10) y el hwnd es distinto para cada formulario, por lo que me veo obligado a usar un mdiform. Tembién he pensado mostrar los formularios en un picturebox. En todo caso es posible que a más de alguien le sirva, funciona perfecto te avisa cuando la ventana recupera el foco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar