在另一篇对上文所构建的ExtendWebBrowser类继续扩展的文章中,修改原DocumentComplete事件,传出了pDosp参数,并以Application对象和e.Automationobject的相等比较来做为多framed窗口文档装入完毕的判定条件。此方法对iChat聊天室仍不能正确响应,究其原因,我想应该是聊天室在连续刷新中,事件难以正常触发。目前只得仍用定时器延时触发的方式来进行登录后的附加设置。
程序sngWebBrowser是为了在iChat聊天室中挂机,即当网络重新连通后,要有自动重连功能.对于聊天页面的掉线,最直接的方法自然是针对页面本身进行判断。设计另一定时器每隔段时间(例如1分钟左右)对聊天页面进行判断,发现错误时即自动重新登录。iChat聊天页面突然掉线,某些页面对象会突然失效,那么对此对象的操作会引发脚本错误。有可能导致程序失去进一步响应。现在的关键问题就是如何屏蔽掉javascipt出错窗口。
在ExtendWebBrowser类中,试图捕捉脚本出错事件,但是在多frame窗口中此方法并不可靠。2.0版WebBrowser控件本身的ScriptErrorsSuppressed属性并没有实际效果。因此网上有资料重新包装WebBrowser控件,实现IWebBrowser2接口并将silent属性设为true来解决问题,经实践可行。当然此时需将IE高级设置中的禁用IE和其它的脚本错误提示选项选中(是默认设置,但Web开发人员经常将其打开)。
class EWebBrowser : System.Windows.Forms.WebBrowser { SHDocVw.IWebBrowser2 Iwb2; protected override void AttachInterfaces(object nativeActiveXObject) { Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject; Iwb2.Silent = true; base.AttachInterfaces(nativeActiveXObject); } protected override void DetachInterfaces() { Iwb2 = null; base.DetachInterfaces(); } }
若使用了ExtendWebBrowser,则在引入axIWebBrowser2后为该属性赋值即可
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")] protected override void AttachInterfaces(object nativeActiveXObject) { this.axIWebBrowser2 = (UnsafeNativeMethods.IWebBrowser2)nativeActiveXObject; this.axIWebBrowser2.Silent = true; base.AttachInterfaces(nativeActiveXObject); }
原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/184.html