通过WebBrowser 控件承载的网页与包含控件的应用程序之间的通信

       若要使用该属性启用WebBrowser 控件承载的网页与包含WebBrowser 控件的应用程序之间的通信,一般使用WebBrowser.ObjectForScripting 属性,一般来说只需要使用该属性可以将动态 HTML (DHTML) 代码与客户端应用程序代码集成在一起。为该属性指定的对象可作为window.external 对象(用于主机访问的内置 DOM 对象)用于网页脚本。 具体使用如下:

            Uri url = new Uri("http://10.130.40.220:9081/Test.asp");
            this.webBrowser1.Navigate(url);
            this.webBrowser1.ObjectForScripting = Method.Instance;


       这里只写个小例子,就用默认的命名方式,http://10.130.40.220:9081/Test.asp是一个发布的测试页面,在该示例中,ObjectForScripting 属性被设置为一个类的单件对象,为该属性指定的对象可作为window.external 对象

        Method类定义如下:

class Method
    {
        private static Method m_Instance;
        private static object m_LockObject = new object();

        public static Method Instance
        {
            get
            {
                if (m_Instance == null)
                {
                    lock (m_LockObject)
                    {
                        if (m_Instance == null)
                            m_Instance = new Method();
                    }
                }
                return m_Instance;
            }
        }

        public void Method4Script(string command)
        {
            MessageBox.Show("调用成功");
        }
    }


       这里定义了一个单件共使用,提供了Method4Script方法。

       最终网页的脚本语言里调用如下:

            function LocalMethod4Script(context)
            {
                document.all.txtResult.value= "";
                var result = window.external.Method4Script();
                document.all.txtResult.value= context + "<======>" + result;
            }


       这样的话html中就可以使用程序的处理方法,事实是这样吗?

       当我们编译通过后运行之后会发现出现了异常:

通过WebBrowser 控件承载的网页与包含控件的应用程序之间的通信_第1张图片

      

        这说明在设置过webBrowser控件的ObjectForScripting属性后,还需要设置应用程序对com可见,同时还需要

添加类的访问修饰字public:

[ComVisible(true)]
    public class Method
    //class Method
    {
        private static Method m_Instance;
        private static object m_LockObject = new object();

        public static Method Instance
        {
            get
            {
                if (m_Instance == null)
                {
                    lock (m_LockObject)
                    {
                        if (m_Instance == null)
                            m_Instance = new Method();
                    }
                }
                return m_Instance;
            }
        }

        public void Method4Script(string command)
        {
            MessageBox.Show("调用成功");
        }
    }


        这时可以正常使用:

通过WebBrowser 控件承载的网页与包含控件的应用程序之间的通信_第2张图片

 

        同样,若要从客户端应用程序代码调用网页中定义的函数,请使用可从Document 属性检索的

HtmlDocument象的HtmlDocument.InvokeScript 方法,添加一个按钮,按钮响应事件处理如下:

this.webBrowser1.Document.InvokeScript("EventHandler", new object[] {"hello"});

 

        页面脚本添加:

            function EventHandler(message) 
            { 
                alert(message);
            }


        最终效果如下:

通过WebBrowser 控件承载的网页与包含控件的应用程序之间的通信_第3张图片

 

        需要注意的是其安全性为供直接调用方使用此控件。要求值:LinkDemand命名的权限集FullTrust。到此

通过WebBrowser 控件承载的网页与包含控件的应用程序之间的通信就简单介绍到这里。

你可能感兴趣的:(function,object,command,脚本,null,WebBrowser)