Enumerando
Ventanas
Buscar
una ventana en ejecuci�n y lista de todas las ventanas
Fecha: 23/May/987
Autor: Nacho Cassou [email protected]
Hola Guille,
Aqu� te mando una colaboraci�n sencilla pero que puede ser muy
�til.
- Obtener la lista de todas las
ventanas activas en Windows (y de paso, comprobar si existe
alguna en concreto)
Es para 32 bits y s�lo para VB5 debido a que hay que utilizar el
operador 'AddressOf', que no est� disponible en versiones
anteriores.
No la he probado en Windows NT pero seguro que funciona.
La verdad es que el trabajo lo hace todo una funci�n del API (EnumWindows). Lo que hace esta funci�n es enumerar todas las ventanas existentes en Windows (visibles o no) y, por cada una que encuentra, llamar a la funci�n 'Callback' que le hayamos dicho.
�C�mo le decimos cu�l es la funci�n que queremos que se ejecute?. Muy sencillo, utilizando el operador 'AddressOf', que lo que hace es, ni m�s ni menos que pasarle a EnumWindows la direcci�n en memoria (puntero) a nuestra funci�n.
As� pues, tenemos que por cada ventana que encuentre, invocar� una funci�n de nuestro programa (que debe estar en un m�dulo 'bas' y ser p�blica) y pasarle dos par�metros, uno el hWnd (handler) de la ventana encontrada as� como un par�metro que nosotros le hayamos pasado a EnumWindows (aunque yo no lo estoy usando en este caso).
Dentro de nuestra funci�n, tan
s�lo nos queda llamar a otra funci�n del API llamada
'GetWindowText' usando el hWnd que hemos recibido y ya tenemos el
t�tulo de la ventanita de marras, con lo cual, si queremos
comprobar si una determinada ventana existe, lo �nico que hay
que hacer es comparar dos strings (ojo porque el t�tulo obtenido
viene relleno de 'nulls')
As� pues, en cuanto detectamos que la ventana que nos interesa
existe,
le damos como valor de retorno a nuestra funci�n 'False' y as�
EnumWindows deja de rastrear.
Nos vemos,
Nacho.
Nota: He modificado un poco el c�digo y he a�adido la opci�n de "mostrar" todas las ventanas disponibles, si has visto el c�digo que puse en la utilidad ListVentanas, ver�s que usando la subclasificaci�n (gracias a AddressOf) es mucho m�s simple.
Aqu� tienes una "foto" del form de prueba y el c�digo usado:

'
'M�dulo EnumWMod.bas
'
'Original de Nacho Cassou,
'modificado por Guillermo 'guille' Som (24/May/98)
'
Option Explicit
'Declare Function EnumWindows Lib "user32" _
(ByVal lpfn As Long, ByVal lParam As Long) As Boolean
'Si se quiere usar lParam como par�metro de retorno
Declare Function EnumWindows Lib "user32" _
(ByVal lpfn As Long, lParam As Any) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hWnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Public TituloABuscar As String
Public SWEncontrado As Boolean
Public Function FuncRetNombres(ByVal hWnd As Long, Parametro As Long) As Boolean
Dim Titulo As String * 256
Dim Ret As Long
Dim NombreVentana As String
DoEvents
Ret = GetWindowText(ByVal hWnd, ByVal Titulo, ByVal Len(Titulo))
NombreVentana = Left$(Titulo, Ret)
If Len(NombreVentana) Then
Form1.List1.AddItem NombreVentana
End If
FuncRetNombres = True
End Function
Public Function FuncionRetorno(ByVal hWnd As Long, Parametro As Long) As Boolean
Dim Titulo As String * 256
Dim Ret As Long
Parametro = Parametro + 1
DoEvents
Ret = GetWindowText(ByVal hWnd, ByVal Titulo, ByVal Len(Titulo))
If Left$(Titulo, Len(TituloABuscar)) = TituloABuscar Then
SWEncontrado = True
FuncionRetorno = False
Else
FuncionRetorno = True
End If
End Function
'Form EnumWForm.frm
'
'Original de Nacho Cassou,
'modificado por Guillermo 'guille' Som (24/May/98)
'
Option Explicit
Private Sub Command1_Click()
Dim bRet As Boolean
Dim Parametro As Long
TituloABuscar = Text1
SWEncontrado = False
bRet = EnumWindows(AddressOf FuncionRetorno, Parametro)
If SWEncontrado Then
MsgBox "Encontrado, se ha buscado en " & Parametro & " ventanas"
Else
MsgBox "No encontrado, se ha buscado en " & Parametro & " ventanas"
End If
End Sub
Private Sub Command2_Click()
Dim bRet As Boolean
List1.Clear
bRet = EnumWindows(AddressOf FuncRetNombres, ByVal 0&)
End Sub
Private Sub Form_Load()
Text1 = "Autoexec.bat - WordPad"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set Form1 = Nothing
End Sub
Pulsa este link para bajarte los listados de ejemplo (EnumWnd_nc.zip 2.20 KB)