obtener ventana hija que tiene el foco de una aplicacion externa?

Iniciado por LeandroA, 9 Junio 2008, 21:38 PM

0 Miembros y 1 Visitante están viendo este tema.

LeandroA

Buenas alguien sabe con que api puedo obtener la ventana (ventana hija, control) que tiene el foco, pero no me refiero a una ventana padre sino a el control que tiene el foco

ya probe con:

GetFocus, pero este solo me devuelve el hwnd dentro de mi aplicacion, yo lo que quiero es saber dentro de todo windows cual es el hwnd que tiene el foco.

GetForegroundWindow me devuelve el hwnd de la ventana padre activa, por lo tanto no me sirve.

GetActiveWindow ni a palos

WindowFromPoint tampoco porque yo podria activar una ventana con el teclado

alguien conoce alguna forma?

Saludos

seba123neo

Hola,Leandro,mira busca esto en el google GetFocusEx,ojala existiera jaja,pero mira lo que te aparece,te aparece una pregunta igual que la tuya en ingles y dan la respuesta,y le da un codigo en C,te la pego aca para que veas:

Pregunta:

GetFocus is a very useful API function used to find window which has keyboard focus. However, this function has a limitation - focused window must be created by the calling thread or GetFocus will return NULL. On desktop Windows it was possible to walkaround this problem using AttachThreadInput function. However, on CE-based devices this function is not available. So, how can I use GetFocus to find focused window created by another process?

Respuesta:

To make GetFocus work, you need to call it from a thread which created focused window. Usually (though not quite always) this is the same thread which created top-level foreground window (obtained with GetForegroundWindow). The trick is to subclass this window and the send it a special message which will be processed by your window proc. Since your window proc will be called by a thread in another process, you can just call GetFocus and return HWND as LRESULT to your own process. Note that on desktop this trick will not work since each process has its own address space and subclassing between process boundaries is not possible. But on CE it does work.

Codigo Fuente:[/b

I've written a small function, GetFocusEx, which uses the trick described above. You can use it in your projects the same way you use GetFocus. GetFocusWindowProc is a window proc assigned to foreground window. If it gets special message (registered with RegisterWindowMessage function) it calls GetFocus and returns obtained HWND as LRESULT. Otherwise it just forwards messages to original window proc using CallWindowProc function.

static WNDPROC g_pOldWndProc = NULL;
static UINT g_uGetFocusMessage = RegisterWindowMessage(_T("SpecialGetFocusMessage"));
static LRESULT WINAPI GetFocusWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == g_uGetFocusMessage)
{
return (LRESULT)GetFocus();
}
else
{
return CallWindowProc(g_pOldWndProc, hWnd, uMsg, wParam, lParam);
}
}

HWND GetFocusEx()
{
HWND hWnd = GetForegroundWindow();
if(!IsWindow(hWnd))
return NULL;

g_pOldWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC);
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)GetFocusWindowProc);

HWND hResult = (HWND)SendMessage(hWnd, g_uGetFocusMessage, 0, 0);

SetWindowLong(hWnd, GWL_WNDPROC, (LONG)g_pOldWndProc);
g_pOldWndProc = NULL;

return hResult;
}


se que escribir codigo en C en el foro de visual basic no es lo que se ahce,pero en este caso lo necesitaba la respuesta...

fijate si de ahi podes sacar algo util...

saludos.


La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

~~

Y si no logras traducirlo pregunta Leandro, que te hecho una manita :P

LeandroA

Cita de: E0N en 10 Junio 2008, 03:22 AM
Y si no logras traducirlo pregunta Leandro, que te hecho una manita :P

Hola Te lo agradeceria Eon, porque me queda la duda si hace un subclass, si es asi creo que en visual no voy a tener mucha suerte.

Saludos

cobein

Hola Leandro, sabes que me parece que no es lo que buscas... pero bueno traducilo no es mucho, cualquier cosa despues lo resolvemos
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

LeandroA

bueno algo traduje pero no me funciono ya que con visual no se puede hacer el subclass a app externas, bueno por lo menos a mi no me funciono :huh:. igual voy a mirar un poco mas el google.

Saludos


cobein

Aca ta!!! :D costo encontrarlo

Source: http://www.vbforums.com/showthread.php?p=1640021#post1640021

Option Explicit

Private Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, _
                                                         ByVal idAttachTo As Long, _
                                                         ByVal fAttach As Long) _
                                                         As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, _
                                                                lpdwProcessId As Long) _
                                                                As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long


Private Sub Timer1_Timer()
Dim hFore As Long, hFocus As Long

    hFocus = GetFocus
   
    If hFocus = 0 Then
        hFore = GetForegroundWindow()
        Call AttachThreadInput(GetWindowThreadProcessId(hFore, 0&), GetCurrentThreadId, True)
        hFocus = GetFocus
        Call AttachThreadInput(GetWindowThreadProcessId(hFore, 0&), GetCurrentThreadId, False)
    End If
   
    Me.Caption = hFocus
   
End Sub
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

seba123neo

muy bueno  ::) ,funciona bien,pero no me esta andando en algunas aplicaciones que si tiene contoles con Hwnd... pero para aplicaciones comunes va muy bien...

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

LeandroA



Buenisimo, estuve dos hora buscando y probando cosas, esta al pelo, muchas gracias.

cobein

Una aclaracion

AttachThreadInput Function


Parameters
idAttach [in]

The identifier of the thread to be attached to another thread. The thread to be attached cannot be a system thread.
idAttachTo [in]

The identifier of the thread to which idAttach will be attached. This thread cannot be a system thread.

A thread cannot attach to itself. Therefore, idAttachTo cannot equal idAttach.
fAttach [in]

If this parameter is TRUE, the two threads are attached. If the parameter is FALSE, the threads are detached.

Como ven no se puede attachar a todos los threads, asi que posiblemente en algunos casos no ande.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.