Visual Basic - Traer frente ventana con búsqueda parcial.

Life is soft - evento anual de software empresarial
   
Vista:

Traer frente ventana con búsqueda parcial.

Publicado por Sonia (2 intervenciones) el 22/01/2011 18:32:00
Hola a todos,

Estoy haciendo una aplicación en Visual Basic 6 y necesito realizar un procedimiento que lleve al frente una ventana de otra aplicación y la ponga en foco con búsqueda parcial del nombre. Me explico:

Por ejemplo, tengo abiertos dos Blocs de notas de Windows en cada uno cargo un fichero de texto con distinto nombre, uno Perrete.txt y otro Gatete.txt con lo cual el nombre de dichas ventanas quedaría así: "Gatete.txt - Bloc de notas" para una y "Perrete.txt - Bloc de notas" para la otra.

Usando las funciones del API de de Windows FindWindow y BringToTop puedo hacer lo que quiero siempre y cuando meta el nombre EXACTO de las ventanas, lo que busco y no sé cómo hacer es que metiendo solo "Gatet" o "Perr" me busque la ventana que tenga dicha cadena y me la traiga al frente enfocada. A ver si alguien me puede echar una mano.

Saludos.
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

RE:Traer frente ventana con búsqueda parcial.

Publicado por pepe (20 intervenciones) el 24/01/2011 19:25:48
Para esto debes recorrer todas las ventanas del escritorio comprobando los textos de título de cada ventana. Usa las funciones GetDesktopWindow() y GetWindow() para recorrer todas las ventanas partiendo de la ventana del escritorio. El esquema seria:

hWnd = GetDesktopWindow()
hWnd = GetWindow(hWnd, GW_CHILD)
Do
' Comprobar el título
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop While hWnd <> 0

Además, usando este esquema puedes hacer un mapa de ventanas en cascada y comprobar las estructuras internas de aplicaciones y procesos no visibles.
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

RE:Traer frente ventana con búsqueda parcial.

Publicado por Sonia (2 intervenciones) el 29/01/2011 21:09:40
Hola pepe,

Gracias por las ideas. He hecho este código que te paso pero no termina de funcionar bien. Se supone que mi código tendría que traer al frente alternativamente con una pausa entre medias de 2 segundos las ventanas "Gatete.txt" y "Perrete.txt" que obviamente tengo abiertas pero nada. Lo hace una vez si están minimizadas y estamos en el escritorio sin otras ventanas maximizadas y encima en el siguiente paso del bucle ya no hace nada... También veo que aunque las mueve no parecen estar activadas y en foco, sólo en su posición anterior y encima una de otra, pero no en foco/activada/maximizada. Y si están maximizadas y al frente no hace nada, sólo cuando están minimizadas. No sé, algo me falla, a ver si me podéis echar una mano que poco faltará para que esté OK, debe ser alguna tontería. Gracias.

Option Explicit
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function GetForegroundWindow Lib "user32" () As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Const GW_HWNDFIRST = 0&
Public Const GW_HWNDNEXT = 2&
Dim i As Integer
Dim Ventana1 As Long
Dim Ventana2 As Long

Private Sub Main()

Ventana1 = TraeVentanaAlFrente("Perrete.txt - Bloc de notas")
Ventana2 = TraeVentanaAlFrente("Gatete.txt - Bloc de notas")

For i = 1 To 3
Call Sleep(2000)
ShowWindow Ventana1, 1

Call Sleep(2000)
ShowWindow Ventana2, 1
Next i

MsgBox "Fin de prueba", vbOKOnly

End Sub

Private Function TraeVentanaAlFrente(ByVal NombreVentana As String) As Long

Dim hwnd As Long
Dim lLenT As Long
Dim lRet As Long

Dim NombreParcial As String
Dim sTitulo As String

On Error GoTo Error

hwnd = GetForegroundWindow

hwnd = GetWindow(hwnd, GW_HWNDFIRST)

Do While (hwnd <> 0)
lLenT = GetWindowTextLength(hwnd)

If (lLenT <> 0) Then
sTitulo = String$(lLenT, 0)
lRet = GetWindowText(hwnd, sTitulo, lLenT + 1)

If sTitulo = NombreVentana Then
TraeVentanaAlFrente = hwnd
Exit Function
End If

End If

hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop

Error:

End Function
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