La Web del Programador: Comunidad de Programadores
 
    Pregunta:  19783 - MANEJADOR VENTANA
Autor:  Julio Gomez
Hola buenos días. Gracias ante todo.
Mi pregunta creo que es un poco complicada, estoy desarrollando un programa en VB utilizando Apis, el programa ya esta terminado, pero me gustaria que fuera lo más configurable posible, entonces, necesito obtener el manejador de una ventana, pero no quiero hacerlo poniendo el nombre de la aplicación (ej. findwindow(vbnullstring,"calculadora")), hay alguna manera de saber el manejador de la ventana a traves del identificador del proceso o mendiante el thread.
Si supieran de alguna Api que a mi se me haya pasado o alguna función les estaría muy agradecido.

Atentamente.

  Respuesta:  Javier Perez
La función GetWindowThreadProcessId te permite obtener el identificador del proceso de una ventana determinada, que es lo inverso de lo que necesitas saber; a partir de esta información es posible obtener la relación que buscas haciendo un recorrido por las ventanas activas hasta encontrar aquella para la que esta función te devuelve el identificador de proceso que tu conoces. La función podría ser algo así:

Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const GW_HWNDPREV = 3
Public Const GW_OWNER = 4
Public Const GW_MAX = 5
Public Const GW_CHILD = 5

Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function GetNextWindow Lib "user32" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Declare Function GetTopWindow Lib "user32" (ByVal hwnd As Long) As Long

Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Public Function ObtenerVentanaProceso(hproceso As Long) As Long
' Devuelve el hwnd correspondiente a la ventana del proceso hproceso

Dim hwnd As Long
Dim hProcessId As Long
Dim hThreadId As Long

' Obtenemos el identificador de la ventana de nivel superior
hwnd = GetTopWindow(0)
Do
' Obtenemos el identificador del proceso creador de la ventana
hThreadId = GetWindowThreadProcessId(hwnd, hProcessId)

If hProcessId = hproceso Then
' Es una ventana del proceso buscado; comprobamos si es una ventana padre
If GetWindow(hwnd, GW_CHILD) <> 0 Then
' Encontrada la ventana buscada
Exit Do
End If
End If

hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop Until hwnd = 0

ObtenerVentanaProceso = hwnd

End Function