Enumerando
Ventanas
Buscar
una ventana en ejecución y lista de todas las ventanas
Fecha: 23/May/987
Autor: Nacho Cassou Ignacio.Cassou@wl.com
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)