C # basado en coordenadas del ratón dentro de la página para tomar los miembros coordinan .es

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");

Supongo que te gusta

Origin www.cnblogs.com/soundcode/p/12583779.html
Recomendado
Clasificación