zoukankan      html  css  js  c++  java
  • 蛙蛙推荐:蛙蛙牌网页捕捉器

    蛙蛙推荐:蛙蛙牌网页捕捉器

    摘要:你有没有看到一篇好文章想保存到本地,有没有想过只保存网页选中的部分而不要那些不必要的导航和广告,本贴告诉你达到这个目的的思路及主要代码。

    思路:首先我们要获取到所有IE窗口,无论是哪个IE进程的,这个我们要用引用"Microsoft Internet Controls(SHDocVw)"的com组件,用它的SHDocVw.ShellWindowsClass类来枚举用户打开的所有的IE页面。然后我们要用GetForegroundWindow API来获取前置的窗口,再用GetClassName API来获取前置窗口的Class,如果是“IEFrame”,说明当前窗口是IE,然后枚举所有的IE页面,对比每个IE页面的句柄是否是当前活动窗口的句柄,如果是,那么这个SHDocVw.InternetExplorer就是对应这当前处于活动窗口的IE的对象。为了方便操作HTML模型和IE对象,我们再引入Microsoft.mshtml程序集(这个是.NET程序集,前面那个SHDocVw是个Com互操作程序集,不过应该每台机器都装了IE,所以SHDocVw不需要单独分发)。SHDocVw.InternetExplorer.Document可以转换成mshtml.IHTMLDocument2类型,然后mshtml.IHTMLDocument2.body有innerHTML属性,就是当前网页的HTML文本了。mshtml.IHTMLDocument2.selection.createRange()表示用户在网页上选中的区域,这个做web的应该很熟,该方法返回mshtml.IHTMLTxtRange类型,该类型有htmlText属性,表示用户所选区域的html文本。
    这样所有必要的因素都有了,把这些综合在一起,就可以写个工具来快速保存你感兴趣的网页了。

    另外本文还演示如下技巧:
    1、如何实现无标题窗口,如果拖动无标题窗口,如何让窗口永远处于前置状态;
    2、如何解决前置窗口上的按钮要点击两次才能生效的问题,第一次点击是激活窗口,第二次单击按钮才会生效;
    3、让窗体初始化在屏幕的右下角;

    主要代码如下,不长

    using System;
    using System.Diagnostics;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows.Forms;
    using mshtml;
    using SHDocVw;

    namespace CapIe
    {
        
    public partial class Form1 : Form
        
    {
            
    private fields

            
    Form 相关

            
    网页捕捉相关

            
    窗体拖动相关

            
    下拉菜单处理

            
    private void toolStrip1_MouseHover(object sender, EventArgs e)
            
    {
                Focus(); 
    //解决按钮要点击两次的bug
            }

        }

    }


    改进:目前只能当IE为活动窗口时,才能捕捉网页,我们可以先获取鼠标位置,然后用WindowFromPoint获取鼠标所在区域的窗口,再获取这个窗口的Class,看是否是“Internet Explorer_Server”,然后下面的步骤和上面的一样,这样的做的好处是一些IE内核的浏览器,比如傲游啦,GreenBrowser等浏览器也能想办法捕捉网页,因为只要是IE内核,显示网页的那部分的的Window的Class都是"Internet Explorer_Server"。找到这个窗口后再调用GetParent获取上层的窗口,再和ShellWindows枚举出来的窗口句柄对比,找到当前打开的网页。

    [DllImport("user32")]
    private static extern IntPtr WindowFromPoint(
    Point Point  
    //坐标
    );
    [DllImport(
    "User32.dll")]
    public static extern IntPtr GetParent(IntPtr hWnd);

    int x = Cursor.Position.X;
    int y = Cursor.Position.Y;
    Point p 
    = new Point(x, y);
    IntPtr formHandle 
    = WindowFromPoint(p);

    另外,就是像IE7这种的多标签浏览器,获取当前窗口,还要获取当前激活的标签页是哪个,否则捕获的网页可能不对,这就需要再想办法了,留给大家吧,想实现的话具体大家参考相关链接吧。

    点击下载示例(不包含Microsoft.mshtml.dll,应该在C:\Program Files\Microsoft.NET\Primary Interop Assemblies目录下cap_ie.zip

    相关链接: 

    SOS!!!如何获取鼠标再在的窗口的句柄
    http://topic.csdn.net/t/20010612/14/156129.html

    GetWindowRect,GetClientRect,和ScreenToClient
    http://hi.baidu.com/yh121212/blog/item/521172c646b7211b9c163d3c.html 

    请教out参数的用法
    http://topic.csdn.net/t/20050304/12/3824234.html

    从C#程序中调用非受管DLLs [择自博客园]
    http://blog.csdn.net/ericksky/archive/2006/07/27/988128.aspx

    GetCursorPos/WindowFromPoint/SendMessage (用API函数向Edit框发送字符)
    http://hi.baidu.com/gamevip/blog/item/cd4ac8119cef2111b8127b35.html

    如何连接到 Internet Explorer 的运行实例
    http://support.microsoft.com/kb/176792

    FileNotFoundException error using SHDocVw.ShellWindows
    http://bytes.com/forum/thread656636.html

    VB Webbrowser控件使用方法
    http://www.zxbc.cn/html/20080216/31664_3.html

    从HWnd得到IWebbrowser2接口
    http://www.zxboy.com/article.asp?id=100

    GetActiveWindow与GetForegroundWindow两者有何区别?
    http://www.qqgb.com/Program/VC/VCJQ/Program_166012.html

    MSHTML, Dom, and copying objects from a WebBrowser Control
    http://lazycoders.blogspot.com/2007/06/mshtml-dom-and-copying-objects-from.html

    我想找到当前IE(7)当前的文档对象,已有部分代码,请求大家帮忙!C#_WinFrom 
    http://topic.csdn.net/u/20070404/20/17979fe9-a223-44dc-aab5-b8edb8fbffd0.html

    Internet Explorer Activity Monitor
    http://www.codeproject.com/KB/cs/IE_Activity_Monitor.aspx?fid=229256&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=1350993

    C#获得IE进程内的IDocument对象代码
    http://blog.csdn.net/shiff/archive/2007/12/05/1919000.aspx

  • 相关阅读:
    【爬虫】python+urllib+beautifusoup爬取花瓣网美女图片
    Django urls.py报错: raise TypeError('view must be a callable or a list/tuple in the case of include()
    python国内豆瓣源
    python pip使用报错:Fatal error in launcher: Unable to create process using '"'
    warning: refname 'HEAD' is ambiguous解决方法
    twisted.internet.error.DNSLookupError: DNS lookup failed: address "'http:" not found: [Errno 11001] getaddrinfo failed.解决办法
    react + iscroll上拉加载下拉刷新分享
    盘点网页图标几种解决方案
    宽度自适应布局
    jqueryUI
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/cap_ie.html
Copyright © 2011-2022 走看看