c# 从IE浏览器获取当前页面的内容

private void timer1_Tick(object sender, EventArgs e)
        {
            lock (currentLock)
            {
                System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
                if (_leftClick)
                {
                    timer1.Stop();
                    _leftClick = false;

                    _lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
                    if (_lastDocument != null)
                    {
                        if (_getDocument)
                        {
                            _getDocument = true;
                            try
                            {
                                string url = _lastDocument.url;
                                string html = _lastDocument.documentElement.outerHTML;
                                string cookie = _lastDocument.cookie;
                                string domain = _lastDocument.domain;

                                var resolveParams = new ResolveParam
                                    {
                                        Url = new Uri(url),
                                        Html = html,
                                        PageCookie = cookie,
                                        Domain = domain
                                    };

                                RequetResove(resolveParams);
                            }
                            catch (Exception ex)
                            {
                                System.Windows.MessageBox.Show(ex.Message);
                                Console.WriteLine(ex.Message);
                                Console.WriteLine(ex.StackTrace);
                            }
                        }
                    }
                    else
                    {
                        new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
                    }

                    _getDocument = false;
                }
                else
                {
                    _pointFrm.Left = MousePoint.X + 10;
                    _pointFrm.Top = MousePoint.Y + 10;
                }
            }

        }

第11行的  GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))  分解下,先从鼠标坐标获取页面的句柄:

public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
        {
            IntPtr handle = Win32APIsFull.WindowFromPoint(p);
            if (handle != IntPtr.Zero)
            {
                System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
                if (Win32APIsFull.GetWindowRect(handle, out rect))
                {
                    return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
                }
            }
            return IntPtr.Zero;

        }

接下来,根据句柄获取页面内容:

public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
        {
            IntPtr result = Marshal.AllocHGlobal(4);
            Object obj = null;

            Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
            if (Marshal.ReadInt32(result) != 0)
            {
                Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
            }

            Marshal.FreeHGlobal(result);

            return obj as HTMLDocument;
        }

大致原理:

给IE窗体发送消息,获取到一个指向 IE浏览器(非托管)的某个内存块的指针,然后根据这个指针获取到HTMLDocument对象。

这个方法涉及到win32的两个函数:

[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
        public static extern int SendMessageTimeoutA(
            [InAttribute()] System.IntPtr hWnd,
            uint Msg, uint wParam, int lParam,
            uint fuFlags,
            uint uTimeout,
            System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
        public static extern int ObjectFromLresult(
         int lResult,
         ref Guid riid,
         int wParam,
         [MarshalAs(UnmanagedType.IDispatch), Out]
        out Object pObject
        );

以上就是c# 从IE浏览器获取当前页面的内容的详细内容,更多关于c# 获取浏览器页面内容的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#实现清除IE浏览器缓存的方法

    本文实例讲述了C#实现清除IE浏览器缓存的方法.分享给大家供大家参考.具体如下: 项目中碰到wpf webbrowser的几个问题,在此记录一下 1.webbrowser中对于jquery的bind事件的处理. 在普通的浏览器下一下这种写法没有任何问题 var content = $("<div><h4><span>" + category_name + "</span>(<a id='href_" + guid

  • C# 利用Selenium实现浏览器自动化操作的示例代码

    概述 Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C. java.ruby.python.或是C# ,你都可以通过selenium完成自动化测试.本文以一个简单的小例子,简述C# 利用Selenium进行浏览器的模拟操作,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点 要实现本例的功能,除了要掌握Html ,JavaScript,CSS等基础知识,还涉及以下知识点: log4net:主要用于日志的记录和存储,本例采用log4net进行日志记录,便于过程跟踪

  • C#实现基于IE内核的简单浏览器完整实例

    本文实例讲述了C#实现基于IE内核的简单浏览器.分享给大家供大家参考.具体如下: Form1.cs如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Kit

  • C#实现多选项卡的浏览器控件

    本文详细为大家分享了C#多选项卡的浏览器控件的设计与实现,供大家参考,具体内容如下 1.  为什么我们需要多选项卡的浏览器控件 项目中需要使用WinForm应用程序来包装BS应用程序的浏览器外壳,在.NET的WebBrowser中没有多选项卡浏览的自带配置属性,我们需要实现多选项卡的浏览器控件来实现包装BS应用程序的目的,而不会弹出IE浏览器窗口. 2. 我们需要了解哪些知识点 2.1.     WebBrowser控件 WebBrowser 控件为 WebBrowser ActiveX 控件提

  • C#文件下载实例代码(适用于各个浏览器)

    1.cs代码 public void DownFile(string filePath ,string fileName ) { // filePath 文件路径 例如:/File/记录.xlsx // fileName 文件名称 例如:记录.xlsx (要后缀哦) Encoding encoding; // 申明编码 string outputFileName; // 输出名字 Debug.Assert(HttpContext.ApplicationInstance.Request.UserA

  • C# 模拟浏览器并自动操作的实例代码

    本文主要讲解通过WebBrowser控件打开浏览页面,并操作页面元素实现自动搜索功能,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点 WebBrowser:用于在WinForm窗体中,模拟浏览器,打开并导航网页. HtmlDocument:表示一个Html文档的页面.每次加载都会是一个全新的页面. GetElementById(string id):通过ID或Name获取一个Html中的元素. HtmlElement:表示一个Html标签元素. BackgroundWorker 后台执行

  • C#导出pdf的实现方法(浏览器不预览直接下载)

    前言 这篇文章主要给大家介绍了关于C#导出pdf的实现方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 一.接口部分的代码 [HttpGet] public HttpResponseMessage ExportPdf(string id) { string pdfName = ""; //id 查询条件,根据实际情况修改即可 //pdfName 例如download.pdf byte[] pdfData= _policyGapManagerService

  • C#使用默认浏览器打开网页的方法

    本文实例讲述了C#使用默认浏览器打开网页的方法.分享给大家供大家参考.具体实现方法如下: public static bool OpenBrowser(String url) { RegistryKey key = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command\"); String s = key.GetValue("").ToString(); String browserpath = null

  • C# WinForm实现图片浏览器

    C#WinForm程序设计之图片浏览器,这次我们一起做一个图片查看器,这个图片查看器的原始图如下: 我们首先来介绍一下这个原始图的构成: 左边上面是一个 TextBox 和 一个 Button,分别用来显示当前路径以及返回上一个路径.左边下面是一个浏览文件的文件路径树状图(TreeView),用来显示当前路径下的文件和文件夹.右边是一个pictureBox,用来展示选中的图片. 接下来我们一步一步实现这个图片查看器! 首先大家应该看到了左边的TreeView上面已经有显示当前PC的所有路径信息,

  • C#浏览器提示跨域问题解决方案

    一,我们使用两个域名互相访问的时候会提示跨域,原因在哪里呢?如下图跨域,我们探究下 是什么原因导致浏览器报这个错呢? 二,我们研究下看看请求是否成功.,如下图,浏览器返回的是200,证明请求是成功了,同时返回是成功了,那为什么还提示跨域呢? 三,经过看浏览器跨域的提示可知道"No 'Access-Control-Allow-Origin' header is present on the requested resource",我们是返回的head缺少了允许的域名,这个是浏览器自己的检

  • C#编程实现简易图片浏览器的方法

    本文实例讲述了C#编程实现简易图片浏览器的方法.分享给大家供大家参考,具体如下: 首先需要加上命名空间 using system.io; 拖一个PICTUREBOX,两个TEXTBOX string fold = "";//用来存不包含文件后缀名的路径 string[] files;//用来存当前所有统一后缀文件的总路径 int pos=0;//用于图片切换 private void button1_Click(object sender, EventArgs e) { OpenFil

随机推荐