1. 苏葳的备忘录首页
  2. 编程

多frame网页窗口的脚本错误屏蔽

c# webbrowser frameiChat聊天室的聊天界面是一个多frame的页面,大约有9个左右,导致在WebBrowser页面事件响应处理相当麻烦。.NET 2.0中的WebBrowser控件的DocumentComplete事件固然是对每个frame的页面响应一次,但实际试验过程中始终无法得到确定的事件触发次数,在网络正常的情况下一般在8次到9次之间变动。在Extended .NET 2.0 WebBrowser Control 中提供了DownloadComplete事件,能够可靠的触发,然而此事件并不直接对应于每个frame的页面文档装入完成事件。

在另一篇对上文所构建的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

发表评论

邮箱地址不会被公开。 必填项已用*标注