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)