Example #1
0
        private void CorrectFrameLocations(IHTMLElement frameElement)
        {
            long         x       = 0;
            long         y       = 0;
            IHTMLElement element = frameElement;

            do
            {
                x      += element.offsetLeft;
                y      += element.offsetTop;
                element = element.offsetParent;
            } while (element != null);
            Point         elementLocation         = new Point((int)x, (int)y);
            IHTMLElement2 element2                = (IHTMLElement2)frameElement;
            IHTMLRect     rec                     = element2.getBoundingClientRect();
            Point         elementBoundingLocation = new Point(rec.left, rec.top);

            LOG.DebugFormat("Looking for iframe to correct at {0}", elementBoundingLocation);
            foreach (DocumentContainer foundFrame in frames)
            {
                Point frameLocation = foundFrame.SourceLocation;
                if (frameLocation.Equals(elementBoundingLocation))
                {
                    // Match found, correcting location
                    LOG.DebugFormat("Correcting frame from {0} to {1}", frameLocation, elementLocation);
                    foundFrame.SourceLocation      = elementLocation;
                    foundFrame.DestinationLocation = elementLocation;
                }
                else
                {
                    LOG.DebugFormat("{0} != {1}", frameLocation, elementBoundingLocation);
                }
            }
        }
Example #2
0
        /// <summary>
        /// Create a CaptureElement for every element on the page, which can be used by the editor.
        /// </summary>
        /// <returns></returns>
        public CaptureElement CreateCaptureElements(Size documentSize)
        {
            LOG.DebugFormat("CreateCaptureElements for {0}", Name);
            IHTMLElement  baseElement  = document3.documentElement as IHTMLElement;
            IHTMLElement2 baseElement2 = baseElement as IHTMLElement2;
            IHTMLRect     htmlRect     = baseElement2.getBoundingClientRect();

            if (Size.Empty.Equals(documentSize))
            {
                documentSize = new Size(ScrollWidth, ScrollHeight);
            }
            Rectangle baseElementBounds = new Rectangle(DestinationLocation.X + htmlRect.left, DestinationLocation.Y + htmlRect.top, documentSize.Width, documentSize.Height);

            if (baseElementBounds.Width <= 0 || baseElementBounds.Height <= 0)
            {
                // not visisble
                return(null);
            }

            CaptureElement captureBaseElement = new CaptureElement(name, baseElementBounds);

            foreach (IHTMLElement bodyElement in baseElement.children)
            {
                if ("BODY".Equals(bodyElement.tagName))
                {
                    captureBaseElement.Children.AddRange(RecurseElements(bodyElement));
                }
            }
            return(captureBaseElement);
        }
Example #3
0
        /// <summary>
        /// Recurse into the document tree
        /// </summary>
        /// <param name="parentElement">IHTMLElement we want to recurse into</param>
        /// <returns>List of ICaptureElements with child elements</returns>
        private List <ICaptureElement> RecurseElements(IHTMLElement parentElement)
        {
            List <ICaptureElement> childElements = new List <ICaptureElement>();

            foreach (IHTMLElement element in parentElement.children)
            {
                string tagName = element.tagName;

                // Skip elements we aren't interested in
                if (!CAPTURE_TAGS.Contains(tagName))
                {
                    continue;
                }

                ICaptureElement captureElement = new CaptureElement(tagName);
                captureElement.Children.AddRange(RecurseElements(element));

                // Get Bounds
                IHTMLElement2 element2 = element as IHTMLElement2;
                IHTMLRect     htmlRect = element2.getBoundingClientRect();

                int left   = htmlRect.left;
                int top    = htmlRect.top;
                int right  = htmlRect.right;
                int bottom = htmlRect.bottom;

                // Offset
                left   += DestinationLocation.X;
                top    += DestinationLocation.Y;
                right  += DestinationLocation.X;
                bottom += DestinationLocation.Y;

                // Fit to floating children
                foreach (ICaptureElement childElement in captureElement.Children)
                {
                    //left = Math.Min(left, childElement.Bounds.Left);
                    //top = Math.Min(top, childElement.Bounds.Top);
                    right  = Math.Max(right, childElement.Bounds.Right);
                    bottom = Math.Max(bottom, childElement.Bounds.Bottom);
                }
                Rectangle bounds = new Rectangle(left, top, right - left, bottom - top);

                if (bounds.Width > 0 && bounds.Height > 0)
                {
                    captureElement.Bounds = bounds;
                    childElements.Add(captureElement);
                }
            }
            return(childElements);
        }
Example #4
0
        public void OverNew(HtmlElement h)
        {
            IHTMLRect     location    = HtmlHelp.GetLocation(h);
            Random        random      = new Random();
            int           num         = random.Next(location.left, location.right);
            int           num2        = random.Next(location.top, location.bottom);
            IntPtr        handle      = this.webBrowser.Handle;
            StringBuilder lpClassName = new StringBuilder(100);

            while (lpClassName.ToString() != "Internet Explorer_Server")
            {
                handle = Win32API.GetWindow(handle, 5);
                Win32API.GetClassName(handle, lpClassName, lpClassName.Capacity);
            }
            IntPtr lParam = (IntPtr)((num2 << 0x10) | num);
            IntPtr zero   = IntPtr.Zero;

            Win32API.SendMessage(handle, 0x2a1, zero, lParam);
        }
Example #5
0
        // System drawing point leveraged to get coordinates
        // using System.Drawing   and mshtml
        /// <summary>
        /// Method to get Grid Coordinates of an element
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        public System.Drawing.Point GetScreenPoint(IEElement element)
        {
            IHTMLElement   nativeElement = element.AsHtmlElement;
            IHTMLElement2  offsetElement = (IHTMLElement2)nativeElement;
            IHTMLRect      clientRect    = offsetElement.getBoundingClientRect();
            IHTMLDocument2 doc           = (IHTMLDocument2)nativeElement.document;
            IHTMLWindow3   window        = (IHTMLWindow3)doc.parentWindow;

            int windowLeft  = window.screenLeft;
            int windowTop   = window.screenTop;
            int elementLeft = clientRect.left;
            int elementTop  = clientRect.top;
            int width       = nativeElement.offsetWidth;
            int height      = nativeElement.offsetHeight;

            int clickX = windowLeft + elementLeft + (width / 2);
            int clickY = windowTop + elementTop + (height / 2);

            return(new System.Drawing.Point(clickX, clickY));
        }
Example #6
0
        /// <summary>
        /// 得到元素的位置
        /// </summary>
        /// <param name="elem">元素</param>
        /// <returns></returns>
        public static Rectangle GetElementRect(IHTMLElement body, IHTMLElement elem)
        {
            int x, y, w, h;

            x = y = w = h = 0;

            // 计算元素本身的位置
            IHTMLElement2 elem2    = elem as IHTMLElement2;
            IHTMLRect     elemRect = elem2.getBoundingClientRect();

            x = elemRect.left;
            y = elemRect.top;
            w = elemRect.right - elemRect.left;
            h = elemRect.bottom - elemRect.top;

            // TODO: 计算顶端htmlElem(docElem)的位置,一般不用计算,其位置应该为(0,0,xx,xx)

            // 计算父亲iframes
            if (body.document != elem.document)
            {
                List <IHTMLDOMNode> frames = new List <IHTMLDOMNode>();
                _getEleParentFrames(body as IHTMLDOMNode, elem as IHTMLDOMNode, frames);
                foreach (IHTMLDOMNode f in frames)
                {
                    IHTMLElement2 frame2    = f as IHTMLElement2;
                    IHTMLRect     frameRect = frame2.getBoundingClientRect();
                    x += frameRect.left;
                    y += frameRect.top;
                }
            }

            Rectangle ret = new Rectangle();

            ret.X      = x;
            ret.Y      = y;
            ret.Width  = w;
            ret.Height = h;

            return(ret);
        }
Example #7
0
        public static Rectangle GetElementRect(mshtml.IHTMLElement body, mshtml.IHTMLElement elem)
        {
            int top;
            int num3;
            int num4;
            int left = top = num3 = num4 = 0;

            mshtml.IHTMLElement2 element = elem as mshtml.IHTMLElement2;
            IHTMLRect            o       = element.getBoundingClientRect();

            elem = element as mshtml.IHTMLElement;
            left = o.left;
            top  = o.top;
            num3 = o.right - o.left;
            num4 = o.bottom - o.top;
            if (body.document != elem.document)
            {
                List <mshtml.IHTMLDOMNode> frames = new List <mshtml.IHTMLDOMNode>();
                GetEleParentFrames(body as mshtml.IHTMLDOMNode, elem as mshtml.IHTMLDOMNode, frames);
                foreach (mshtml.IHTMLDOMNode node in frames)
                {
                    IHTMLRect rect2 = (node as mshtml.IHTMLElement2).getBoundingClientRect();
                    left += rect2.left;
                    top  += rect2.top;
                }
            }
            Rectangle rectangle = new Rectangle {
                X      = left,
                Y      = top,
                Width  = num3,
                Height = num4
            };

            if (o != null)
            {
                Marshal.ReleaseComObject(o);
            }
            return(rectangle);
        }
Example #8
0
 internal ClientRect(ScriptContext context, IHTMLRect comObject) : base(context, (Object)comObject)
 {
 }
Example #9
0
 public ElementProperty(FramedElement fe) { 
     bboxRect = (fe.e as IHTMLElement2).getBoundingClientRect();
     this.fe = fe; 
 }