2009-08-25 3 views

Respuesta

11

Hay una función WindowFromPoint().

+0

ya que devuelve un 'HWND', sería' WindowFromPoint' trabajar con ventanas de otro proceso –

+5

HWNDs son válidos en todo el territorio OS, entonces sí. – DeusAduro

+0

gracias, eso es lo que estaba buscando. Utilicé algo como esto befo re: HWND wnd = (HWND) 0x ....; SendMessage (wnd, ...); y funcionó bien (era una ventana para otra aplicación), así que creo que funciona con ese mango también. :) – Razvi

0

No me cites, pero creo que el spy ++ instalaría un enganche WH_CALLWNDPROC. A continuación, se envían todos los mensajes WM_MOUSEMOVE antes de que lleguen a sus ventanas de destino. Por lo tanto, tan pronto como pase el mouse sobre una ventana, el espía ++ recibe un mensaje indicándole qué ventana.

+1

Probablemente no sea el caso: Spy ++ probablemente tome la captura del mouse (SetCapture ()) cuando haces clic en la cruz, entonces recibe los mensajes WM_MOUSEMOVE a medida que los arrastras, no la ventana debajo del puntero. Es probable que Spy ++ simplemente use WindowFromPoint/ChildWindowFromPoint ya que hace que el mouse se mueva, no se requiere enganche. – BrendanMcK

4

Hay alguna información agradable en la parte interna de Spy ++ aquí: http://blogs.msdn.com/b/vcblog/archive/2007/01/16/spy-internals.aspx. Es compatible con la respuesta de DeusAduro, que Spy ++ instala ganchos globales (en realidad 3 ganchos, uno de los cuales es WH_CALLWNDPROC).

También puede encontrar más información sobre un clon de Spy ++ - aquí: http://www.codeproject.com/KB/dialog/windowfinder.aspx.

Además, debe haber una descarga de una aplicación muy similar en el SDK aquí: http://msdn.microsoft.com/en-us/library/Aa231779 pero parece no estar funcionando (sin descarga - como tantos enlaces en MSDN :()

Dependiendo de lo que. desee obtener (si no es un hwnd) también se puede obtener un AutomationElement:?

System.Windows.Point pt = new System.Windows.Point(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y); 
AutomationElement ae = AutomationElement.FromPoint(pt); 
Cuestiones relacionadas