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

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

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

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

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版本等等)也附带上了,主要是之前写的,就懒的去掉。

C#WebBrowrse拦截下载对话框的更多相关文章

  1. JS弹出下载对话框以及实现常见文件类型的下载

    写在前面 JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能. ...

  2. 借助autoit操作上传下载对话框(参数化)

    虫师有一篇文章写的不错,链接如下:http://www.cnblogs.com/fnng/p/4188162.html 他的文章把upload.exe需要上传的文件写死了,下面的内容作为补充. 如果不 ...

  3. C# Web开发打开下载对话框代码

    一个按钮的事件中写: string filename = Sever.UrlEncode("词库.txt"); Response.AddHeader("Content-D ...

  4. .net mvc4 + ajaxfileupload.js 解决IE浏览器中弹出下载对话框问题

    摘要:每一个人遇到的问题都不一样,在网上找了一大圈都没有解决到我的问题!由于我的环境如标题所看到的.攻克了这个问题. 主要问题:在于响应头的设置 Controller: [HttpPost] publ ...

  5. 字符串导出xml文件并弹出下载对话框

    转自:https://blog.csdn.net/zhandingfeng/article/details/53887354 导出单个xml文件:[java] view plain copy      ...

  6. 自己主动更新--下载apk以及提示对话框的实现(3)

    下载apk以及提示对话框的实现 一.步骤: 1. 确定有能够更新的版本号,对话框提醒用户是否进行更新. 2. 选择更新的话,显示下载对话框而且进行下载.否则关闭提示更新对话框. 3. Apk下载完毕后 ...

  7. 在IE中下载Office2007文件时在对话框中下载文件变成ZIP文件的问题

    导致原因: 从IIS或者Tomcat之类的Web服务器通过二进制流下载文件时(比如通过设置Header为Content-disposition:inline),如果被下载的文件是Office2007的 ...

  8. 转载: 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

    最近在做一个下载工具时,发现CSDN上的资源下载时竟然没有被拦截到,经过分析,终于有了一个发现,解决了我之前做文件下载时的乱码问题,所以转载这篇释疑文章,希望有人可以看到,可以从中得到帮助,也用来备忘 ...

  9. Servlet 下载文件

    这几天有点懒散,还好没有忘记看书,上周去了国家图书馆翻阅了一些和Java相关的书籍,其实这些书都是自己以前看过或者听过,按理来说,不应该看自己已经看过的书籍,应该找一些最新的书籍去看,但是每次走到书架 ...

随机推荐

  1. OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)

    上一节我们启用了 Open vSwitch,本节将查看当前的网络状态并介绍 Open vSwitch 涉及的各种网络设备 初始网络状态 查看一下当前的网络状态. 控制节点 ifconfig 显示控制节 ...

  2. 套用JQuery EasyUI列表显示数据、分页、查询

    声明,本博客从csdn搬到cnblogs博客园了,以前的csdn不再更新,朋友们可以到这儿来找我的文章,更多的文章会发表,谢谢关注! 有时候闲的无聊,看到extjs那么肥大,真想把自己的项目改了,最近 ...

  3. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  4. [转]Patch文件结构详解

    N久不来 于是不知道扔在哪儿于是放这里先 如果你觉得碍事的话 帮我扔到合适的版块去.. 导读这是一篇说明文 它介绍了标准冒险岛更新文件(*.patch;*.exe)的格式文章的最后附了一段C#的参考代 ...

  5. C#——传值参数(1)

    //我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家一起学习C#中的值 ...

  6. 用javascript写星际飞机大战游戏

    在github里看到了个不错的脚本游戏,决定亲自动手来写,效果如下 下面是代码的思路分享 把整个代码理解消化确实不容易,但是如果你坚持看完相信你一定会有收获 如果没兴趣可以直接点击下面的链接 复制代码 ...

  7. 使用Jenkins配置Git+Maven的自动化构建

    Jenkins是一个开源的持续集成工具,应用Jenkins搭建持续集成环境,可以进行自动构建.自动编译和部署,非常方便. 在服务器比较少的情况下,Jenkins的优势并不明显,但是随着项目发展,服务器 ...

  8. oracle SEQUENCE 创建, 修改,删除

    oracle创建序列化: CREATE SEQUENCE seq_itv_collection            INCREMENT BY 1  -- 每次加几个              STA ...

  9. 我正在使用Xamarin的跨平台框架—Xamarin.Android回忆录

    一.缘起 在自己给别家公司做兼职外包的时候,已经明确知道外包的活不是那么好干的,一般在经历了初期热血澎湃的激情后,逐渐冷淡,愤怒,再冷淡,再愤怒…,听上去好像高潮迭起,但令人尴尬的是,这高潮迭起我们都 ...

  10. 你可能没注意的CSS单位

    扶今追昔 CSS中的单位我们经常用到px.pt.em.百分比,px和pt不用多说 em em是相对单位,参考物是父元素的font-size,具有继承的特点 如果字体大小是16px(浏览器的默认值),那 ...