C # basado en coordenadas del ratón dentro de la página para tomar los miembros coordinan .es
A veces es necesario para obtener los elementos de fondo de la posición de las coordenadas del cursor del ratón es decir, navegador, sin embargo, se utilizan las coordenadas de la pantalla no son factibles
Por lo que necesitamos para convertir las coordenadas en coordenadas dentro del navegador web y luego conseguir que los miembros a través elementFromPoint.
tmrWatcher_Tick vacío (object sender, EventArgs e) privada { IntPtr CVent = WindowFromPoint (MousePosition); documento dinámico = GetHtmlDocumentByHandle (hWnd); si (documento! = null) { rectángulo R = GetHtmlElementPoint (CVent, MousePosition, documento); //根据鼠标坐标取网页成员坐标 Marshal.FinalReleaseComObject (documento); Console.WriteLine (RX + ":" + rY + ":" + r.Width + ":" + r.Height); } }
Lo anterior es un reloj tmrWatcher de la función de devolución de llamada Tick, utilice la función anterior WindowFromPoint principalmente conseguir
identificador de ventana MousePosition se encuentra, y luego a través de la función GetHtmlDocumentByHandle (para obtener los documentos de la empuñadura)
objeto estático público GetComObjectByHandle (int Msg, Guid riid, IntPtr hWnd) { objeto _ComObject; int lpdwResult = 0; si (SendMessageTimeout (hWnd, el glutamato monosódico, 0, 0, SMTO_ABORTIFHUNG, 1000, ref lpdwResult)!) return null; si (ObjectFromLresult (lpdwResult, riid ref, 0, fuera _ComObject)) return null; volver _ComObject; } Objeto público GetHtmlDocumentByHandle (IntPtr CVent) { string buffer = new String ( '\ 0', 24); GetClassName (hWnd, tampón ref, 25); si (tampón! = "Internet Explorer_Server") nula regresar; retorno GetComObjectByHandle (WM_HTML_GETOBJECT, IID_IHTMLDocument, hWnd); }
Y de hecho mi último post: http: //blog.csdn.net/u012395622/article/details/46404193
No teníamos mucho el acceso y la captura de una página web miembros de documentos simplemente la programación de las interfaces COM Mshtml
pública del rectángulo GetHtmlElementPoint (IntPtr CVent, punto a punto, documento dinámico) { (! == null && documento CVent = IntPtr.Zero) si volver Rectangle.Empty; ScreenToClient (hWnd, punto de ref); elemento dinámico = document.elementFromPoint (punto.x, Punto.y); si (elemento == null) de regreso Rectangle.Empty; tratar { rectángulo o = new Rectángulo () { Y = element.offsetTop, X = element.offsetLeft, Anchura = element.offsetWidth, Altura = element.offsetHeight }; mientras que (element.offsetParent! = null) { elemento = element.offsetParent; oY + = element.offsetTop; oX + = element.offsetLeft; } O RETURN; } Catch { volver Rectangle.Empty; } }
El código anterior se logra obtener un coordenadas exactas de los elementos dentro de una página web, en su conjunto no es difícil de leer.
La razón por tiempo (element.offsetParent! = Null) {...} no porque la página es siempre lo hace el cliente fase
No podemos utilizar la misma rutina de verlo en los controles operativos Win32 donde es engorroso, y el nivel
Difícil de limpiar, que hará que usted no sabe, al final la amplia Afortunadamente, sin embargo, una informática general
Los miembros de los elementos en qué posición de la ventana, siempre y cuando la posición del contenedor primario juntos en la línea. De todos modos, un poco
La interpretación no está claro, me ofende MO
[DllImport ( "user32.dll", charset = CharSet.Auto, ExactSpelling = true)] pública bool extern estático ScreenToClient (IntPtr CVent, ref Punto lpPoint); [DllImport ( "user32.dll", SetLastError = true)] [para volver: MarshalAs (UnmanagedType.Bool)] public static extern bool GetClassName ( [A] IntPtr CVent, [MarshalAs (UnmanagedType.VBByRefStr)] cadena de ref IpClassName, [En ] int nMaxCount ); [DllImport ( "Oleacc.dll", SetLastError = true)] [para volver: MarshalAs (UnmanagedType.Bool)] public static extern bool ObjectFromLresult ( [A] int lResult, [A] Ref Guid riid, [In] int wParam, [Fuera, MarshalAs (UnmanagedType.IUnknown)] a cabo objeto ppvObject ); [DllImport ( "user32.dll", SetLastError = true)] [para volver: MarshalAs (UnmanagedType.I4)] public static int extern RegisterWindowMessage ( [A] lpString cadena ); [DllImport ( "user32.dll", EntryPoint = "SendMessageTimeoutA", SetLastError = true)] [para volver: MarshalAs (UnmanagedType.Bool)] public static extern bool SendMessageTimeout ( [A] IntPtr MSG, [en], int CVent, [En ] int wParam, [In] int lParam, [In] fuFlags int, [In] int uTimeout, [In, Out] ref int lpdwResult ); [DllImport ( "user32.dll", SetLastError = true)] [para volver: MarshalAs (UnmanagedType.SysInt)] extern public static IntPtr WindowFromPoint ( [A] de puntos Los puntos ); const int pública SMTO_ABORTIFHUNG = 2; público de sólo lectura estática int WM_HTML_GETOBJECT = RegisterWindowMessage ( "WM_HTML_GETOBJECT"); público de sólo lectura estática Guid IID_IHTMLDocument = new Guid ( "626fc520-a41e-11CF-a731-00a0c9082637");