c#.NET 开发BHO插件,FileDownload事件如何响应?怎样能够阻止对应的下载对话框的出现,使得IE能够继续导航

huxiaohuangcheng 2008-09-02 09:37:53
本人在用c#开发IE的BHO插件,实现从数据库中读入URL,依次自动实现访问,但遇到个问题,当url代表的是一个“下载文件的url”时,IE会自动跳出下载对话框,请问在这种情况下我怎样实现持续自动化IE?对此我采用的两个方法均不奏效
1:通过定义SHDocVw.WebBrowser接口的FileDownload事件响应,当有文件下载时,自动实现文件保存到默认文件夹。但编程实现时发现FileDownload时间根本就没有触发/或者根本没有调用此事件的响应消息(消息框没有弹出,如下)。而DocumentComplete等事件均可正确触发和响应。
代码如下:

//定义IObjectWithSite接口
[
ComVisible(true),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")
]

public interface IObjectWithSite
{
[PreserveSig]
int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site);
[PreserveSig]
int GetSite(ref Guid guid, out IntPtr ppvSite);
}



//接口功能实现
[ComVisible(true),
Guid("8a194578-81ea-4850-9911-13ba2d71efbd"),
ClassInterface(ClassInterfaceType.None)
]
public class BHO:IObjectWithSite
{
WebBrowser webBrowser;
public void OnWebBrowser_FileDownload(ref bool Cancel)
{
System.Windows.Forms.MessageBox.Show("这是一个下载文件"); //此处无任何响应
webBrowser.Quit();
}
#region BHO Internal Functions
public static string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
[ComRegisterFunction]
public static void RegisterBHO(Type type){//注册此组件//}
[ComUnregisterFunction]
public static void UnregisterBHO(Type type){//解除此组件//}
public int SetSite(object site)
{
if (site != null)
{
webBrowser = (WebBrowser)site;
webBrowser.FileDownload+=new DWebBrowserEvents2_FileDownloadEventHandler(this.OnWebBrowser_FileDownload);//挂载事件处理
}
else
{
webBrowser.FileDownload -= new DWebBrowserEvents2_FileDownloadEventHandler(this.OnWebBrowser_FileDownload);
webBrowser = null;
}
return 0;
}
public int GetSite(ref Guid guid, out IntPtr ppvSite){//getsite实现}

...全文
882 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
一国之军 2012-03-07
  • 打赏
  • 举报
回复
有没有好的例子啊??
iaidr421 2012-02-20
  • 打赏
  • 举报
回复
我的解决办法是在保存对话框打开后用sendkey 发送alt-s的键盘指令 但是有一个问题是系统不能锁定,锁定的话就不好用了
杨友山 2011-11-04
  • 打赏
  • 举报
回复
苍天啊,我现在也遇到这个问题了,怎么办呐???
zhjb1 2009-10-04
  • 打赏
  • 举报
回复
我在ASP里面做过类似的工作,试将文档的所有读出来,而后分段判断是URL还是文档。你可以参照这个思路试试。因为我的C#应用还处于深入学习阶段。
qshzf 2008-10-22
  • 打赏
  • 举报
回复
up
chenzl79 2008-10-21
  • 打赏
  • 举报
回复
兄弟,不知道你的这个问题解决了没有....

我现在也是用 C# 弄 BHO 做 IE

也是遇到这样的题..

不管,你是否解决:

希望你加我QQ :695331226

希望相交流学习
LQknife 2008-09-03
  • 打赏
  • 举报
回复
微软想把什么都封装在.net下 可是又不不把功能彻底化
优途科技 2008-09-03
  • 打赏
  • 举报
回复
关注一下.顶一下!
浮生若梦丶 2008-09-02
  • 打赏
  • 举报
回复
up
huxiaohuangcheng 2008-09-02
  • 打赏
  • 举报
回复
微软帮助与支持里面有一篇文章BUG: FileDownload event handler in .NET WebBrowser host is never called,提到了此问题http://support.microsoft.com/kb/325204/en-us/
但感觉在c#中实现起来非常困难,不知道哪位高手有其他办法?
我现在需要的功能是在IE开始导航时辨别出“链接URL”是否是下载链接,如果是则停止此url导航,继续浏览下一个url。响应Iwebbrowser的什么事件能够实现此功能?
huxiaohuangcheng 2008-09-02
  • 打赏
  • 举报
回复
楼上的再问下,那通过什么方式能够区分出url是正常的浏览网页还是对应于下载事件呢?
周公 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huxiaohuangcheng 的回复:]
微软帮助与支持里面有一篇文章BUG: FileDownload event handler in .NET WebBrowser host is never called,提到了此问题http://support.microsoft.com/kb/325204/en-us/
但感觉在c#中实现起来非常困难,不知道哪位高手有其他办法?
我现在需要的功能是在IE开始导航时辨别出“链接URL”是否是下载链接,如果是则停止此url导航,继续浏览下一个url。响应Iwebbrowser的什么事件能够实现此功能?
[/Quote]
这个想法在我2006年做一个电子杂志项目的时候就想到了,我们当时的想法就是当用户在浏览器点击的超级连接是电子杂志下载地址时就启动我们自己开放的电子杂志阅读器下载,否则依然交由IE处理。

后来发现问题很多,强程序命名集、GUID、安全还有权限一堆设置,挺麻烦的。最后项目取消了,那个东西也是半途而废了。
BHO(Browser Helper Object,浏览器辅助对象,简称BHO)   BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。通过这个接口,程序员可以编写代码获取浏览器的行为,比如“后退”、“前进”、“当前页面”等,利用BHO的交互特性,程序员还可以用代码控制浏览器行为,比如修改替换浏览器工具栏,添加自己的程序按钮等。这些在系统看来都是没有问题的。BHO原来的目的是为了更好的帮助程序员打造个性化浏览器,以及为程序提供更简洁的交互功能,现在很多IE个性化工具就是利用BHO的来实现。 编辑本段 技术优势   “浏览器劫持”是一种不同于普通病毒木马感染途径的网络攻击手段,而是使用各种技术(如DLL插件等)插件对用户的浏览器进行篡改。安装后,它们会成为浏览器的一部分,可以直接控制浏览器进行指定的操作,根据需要,可以让你打开指定的网站,甚至是收集你系统中的各种私密信息。最可怕的是只有当浏览器已经被劫持了,你才会发现,反应过来,原来电脑已经出现了问题。比如IE主页被改,开机就会弹出广告等等。目前,浏览器劫持已经成为Internet用户最大的威胁之一。其实“浏览器劫持”就是通过BHO的技术手段进入你的系统的,而这种技术是合法的。   从某种观点看,Internet Explorer同普通的Win32程序没有什么两样。借助于BHO,你可以写一个进程内COM对象,这个对象在每次启动时都要加载。这样的对象会在与浏览器相同的上下文中运行,并能对可用的窗口和模块执行任何行动。例如,一个BHO能够探测到典型的事件,如GoBack、GoForward、DocumentComplete等;另外BHO能够存取浏览器的菜单与工具栏并能做出修改,还能够产生新窗口来显示当前网页的一些额外信息,还能够安装钩子以监控一些消息和动作。 编辑本段 注册表位置   BHO在注册表中的位置是:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects,有兴趣的朋友可以在这里做做实验。不过一定要记住你更改的每一步,否则会出错的哦!   BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何 BHO对象与浏览器实例的生命周期是一致的。其次, BHO仅存在于Internet Explorer 4.0及以后版本中。   如果你在使用Microsoft Windows? 98, Windows 2000, Windows 95, or Windows NT版本4.0 操作系统的话,也就一块运行了活动桌面外壳4.71,BHO也被 Windows资源管理器所支持。 BHO是一个COM进程内服务,注册于注册表中某一键下。在启动时,Internet Explorer查询那个键并把该键下的所有对象预以加载。   迅雷中TDAtOnce_Now.dll和xunleiBHO_Now.dll为安全   如何发现BHO里面的危险模块.   首先有一个能够查看进程的软件 冰刃就不错 下面以它为例:   先打开冰刃—会看到一个BHO在这里就可以看到危险BHO进程了

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧