Handle

Hola, como veo que tienes mucha experiencia en Api me he decidido a hacerte a ti la pregunta. Bueno la cuestión es la siguiente: necesito saber como averiguar el handle de una aplicación, pongamos p.e. El Outlook Express, pero sin utilizar el titulo de la ventana. Yo la lanzo desde mi aplicación y necesito también poder cerrala desde mi aplicación, si busco el titulo de la ventana, la encuentro y puedo cerrarla, pero esto no me sirve del todo ya que el titulo puede cambiar, p.e. Puede cambiar de "Outlook Express - Bandeja de entrada" a "Outlook Express - Bandeja de salida" u otros. Si sabes de alguna función que me permita cerrar una ventana sin utilizar el titulo te lo agradecería.
Un saludo y gracias.

1 Respuesta

Respuesta
1
Te paso una función para tomar el Handle de una ventana con el numero de proceso que has generado, copia esto en el procedimiento general de la aplicación:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Const GW_HWNDNEXT = 2
Dim mWnd As Long
Function InstanceToWnd(ByVal target_pid As Long) As Long
Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
Do While test_hwnd <> 0
If GetParent(test_hwnd) = 0 Then
test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
If test_pid = target_pid Then
InstanceToWnd = test_hwnd
Exit Do
End If
End If
test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
Loop
End Function
ahora lo utilzas asi:
con esto abres la aplicacion
Dim Pid As Long
Pid = Shell("C:\Archivos de programa\Outlook Express\msimn.exe", vbNormalFocus)
If Pid = 0 Then MsgBox "Error starting the app"
mWnd = InstanceToWnd(Pid)
Así en la variable mWnd quedara el Handle del Outlook, así que lo puedes cerrar con esto:
DestroyWindow(mWnd)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas