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 |