Autor
|
Tema: obtener ventana hija que tiene el foco de una aplicacion externa? (Leído 6,641 veces)
|
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
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
~~
|
Y si no logras traducirlo pregunta Leandro, que te hecho una manita
|
|
|
En línea
|
|
|
|
LeandroA
|
Y si no logras traducirlo pregunta Leandro, que te hecho una manita 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
|
|
|
En línea
|
|
|
|
cobein
|
Hola Leandro, sabes que me parece que no es lo que buscas... pero bueno traducilo no es mucho, cualquier cosa despues lo resolvemos
|
|
|
En línea
|
|
|
|
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 . igual voy a mirar un poco mas el google. Saludos
|
|
|
En línea
|
|
|
|
cobein
|
Aca ta!!! costo encontrarlo Source: http://www.vbforums.com/showthread.php?p=1640021#post1640021Option 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
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Obtener el identificador de una segunda ventana hija
Programación Visual Basic
|
lobo3072
|
4
|
2,519
|
13 Julio 2013, 00:26 am
por lobo3072
|
|
|
[SOS!][Obtener información de una aplicación externa]
Android
|
WaRc3L
|
0
|
2,209
|
13 Abril 2014, 02:18 am
por WaRc3L
|
|
|
[Duda]Es posible detectar teclas si mi aplicacion no tiene el foco
« 1 2 »
Java
|
PabloPbl
|
14
|
8,389
|
1 Abril 2015, 04:48 am
por PabloPbl
|
|
|
Obtener texto de label en aplicación externa WPF
.NET (C#, VB.NET, ASP)
|
TomaSs
|
4
|
5,300
|
14 Mayo 2016, 04:13 am
por TomaSs
|
|
|
Posicionar ventana hija siempre relativa a la ventana padre.-
Scripting
|
El mas antiguo
|
2
|
3,571
|
17 Agosto 2022, 14:34 pm
por El mas antiguo
|
|