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;
        }

大致原理:

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

给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# 获取浏览器页面内容的资料请关注179885.Com其它相关文章!

猜你在找的c# 从IE浏览器获取当前页面的内容相关文章

从IE浏览器获取当前页面内容可能有多种方式,今天我所介绍的是其中一种方法。基本原理:当鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然
这篇文章简要的说明了如何去修改Unity默认的脚本编辑器,大大提升了灵活性和便捷性,文本有详细的图文介绍,能让你观看的更加清晰,希望对你有所帮助
在Word中可插入文本框,默认情况下插入的文本框中的文字方向为横向排列,对于一些特殊文档的设计要求,需要改变文字方向,本文就详细的介绍一下使用,感兴趣的可以了解一下
这篇文章详细的讲解了如何从0开发出一个Unity3D的小游戏愤怒的小鸟,本文包含大量的图片与文字描述,也含有大量的源代码,可以让你快速入手,希望本篇文章对你有所帮
这个简单的飞行棋游戏主要是讲的方法怎么应用,充分的去理解方法和方法的调用。整体收获还是很大的。感兴趣的朋友可以参考下
本文介绍如何通过C# 程序来扫描并读取图片中的文字,这里以创建一个.Net Core程序为例。下面是具体步骤,供参考。有此需求的朋友可以了解下
这篇文章重点给大家介绍C#实现读写文本文件中的数据的一些知识,读取.txt文件数据的实例代码及写入读取过程完整代码,感兴趣的朋友跟随小编一起看看吧
在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码。必须绑定在游戏对象上才能开始它的生命周期。游戏对象可以理解为能容纳各种组件的
Task.Delay(),async/await和CancellationTokenSource组合起来使用可以实现可控制的异步延迟。本文通过多种代码案例给大家分析C#中的Task.Delay()和Thread.Sleep()
本文将结合实例代码,介绍C#多线程处理多个队列数据的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要给大家介绍了关于C#中实现登录功能的相关资料,我们在使用C#做项目的时候,基本上都需要制作登录界面,需求的大佬可以参考下
这篇文章主要为大家详细介绍了Unity实现切割图集工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下