zoukankan      html  css  js  c++  java
  • C#WebBrowrse拦截下载对话框

            为了实现这个功能,可算是折腾不少时间,网上搜素出来的结果基本都是如何屏蔽警告对话框。后来请教一个技术大牛(程序员之窗的主要作者Starts_2000),他用C++实现了,他尝试了下C#也没有解决,就忙其他的去,大牛时间一般都比较宝贵,后来我就将就用那个C++动态库,那个时候我测试环境是 win7 64位 +vs2013,后来系统环境变化成 win10 +vs2015,突然就不好使了,赶紧重新编译C++源码,各种错误,感觉怎么这么不稳定。 怎么办?总不能再让别人帮忙,下次环境变化了继续问别人?  这就要求自己必须用C#实现, 好了 下面进入主题。

    WebBrowser请求一个地址,比如http://download.easyicon.net/png/568613/48/ 会出现下图:

    01

    需要达到的目的:在弹出上面对话框之前能加入自己的代码进行控制。如下图

    02

    为了实现这个功能网上找了些资料,发现有些帮助的地址:

    http://stackoverflow.com/questions/13362922/windows-forms-webbrowswer-control-with-idownloadmanager

    遇到相同问题的有下面2个链接:

    https://q.cnblogs.com/q/57083/

    http://stackoverflow.com/questions/32513190/dllimportregistercallbackpbc-url-and-bindmonikertostreampmk-pbc

    看完这些文档后,我遇到和他们一样的困扰.主要有下面几个问题

    1 找不到完整代码示例,只能东拼西凑的看看

    2 在Download方法里面断点不进去,当然也就没有拦截的效果.

    3 希望不是所有的下载都需要拦截,有些用IE自带的功能进行下载。

    第一个问题: 自己搜索些代码加以整理

    第二个问题: 我发现主要是自己当时接口定义出错

       [ComImport, Guid("6d5140c1-7436-11ce-8034-00aa006009fa"), 
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(false)]
        public interface IServiceProvider
        {
            [return: MarshalAs(UnmanagedType.I4)]
            [PreserveSig]
            int QueryService(ref Guid guidService,   ref Guid riid,                           
            /*[MarshalAs(UnmanagedType.Interface)]*/   IntPtr ppvObject);
        }

    删除注释部分即可,如果还有不进断点的请参照完整源代码。

    第三问题 需要系统API,也有不少人不知道怎么定义这个API,比如上面链接就有个老外再问, API定义如下:

    internal class API
        {
            [DllImport("ole32.dll")]
            internal static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc);
    
            [DllImport("ole32.dll")]
            internal static extern int RegisterCallback(IBindCtx pbc, Uri url);
    
            [DllImport("ole32.dll")]
            internal static extern int BindMonikerToStream(IMoniker pmk, IBindCtx ppbc);
        }
     测试发现 只需要调用 第二个或者第三个API即可实现IE自带下载。
     
    部分代码如下:
            private void DownLoadDemo()
            {
                try
                {
                    DownLoadWebBrowser DownLoadWebBrowser = new DownLoadWebBrowser();
                    DownLoadWebBrowser.FileDownloading += DownLoadWebBrowser_FileDownloading;
                    DownLoadWebBrowser.Navigate(downLoadUrl);
                }
                catch (Exception)
                {
                    throw;
                }
            }
            private void DownLoadWebBrowser_FileDownloading(object sender, FileDownloadEventArgs e)
            {
                string info = string.Format("下载地址{0},是否继续", e.Url.ToString());
                bool downLoad = MessageBox.Show(info, "请选择", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question) == DialogResult.No;
                e.Cancel = downLoad;
            } 

    完整代码下载

    源代码除了拦截下载,其他的一些功能(屏蔽对话框、JS和C#代码互相调用,以及IE版本等等)也附带上了,主要是之前写的,就懒的去掉。

  • 相关阅读:
    求解奖学金问题--贪心
    装饰模式(Decorator Pattern)
    组合模式(Composite Pattern)
    Java基础:容器
    DatabaseMetaData类
    Java命名规范
    MyEclipse快捷键
    工厂模式(Factory)
    单例模式详解以及需要注意的地方(Singleton)
    SpringBoot启动流程与源码
  • 原文地址:https://www.cnblogs.com/QQ81867376/p/6224079.html
Copyright © 2011-2022 走看看