原文:浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

使用场合:

在程序中使用WebBrowser或相关的控件如:axWebBrowser等。打开本地的html文件时,可以在html的脚本中使用自己在.net中定义的类,实现与Internet
Explorer server的互操作。此外也可以在充分利用html在设计界面方面高效,简单的同时,也可以实现一些复杂的特性。

实现:

Code
public class ScriptEvent
    {
        //System.__ComObject 对象
        private object eventObject;
 
        public object EventObect
        {
            get { return this.eventObject; }
            set { this.eventObject = value; }
        }
 
        public object Execute()
        {
            if (null == eventObject)
                return null;
            //JScript.dll中FunctionInstance接口的Guid
            Guid fun_gid = new Guid("{3EEF9758-35FC-11D1-8CE4-00C04FC2B093}");
            Type functionInstance = Type.GetTypeFromCLSID(fun_gid);
            object rev;
            rev = functionInstance.InvokeMember("call", BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, eventObject, null);
            return rev;
        }

ScriptEvent类实现了对脚本事件的封装。

具体使用如下:

Code
[ComVisibleAttribute(true)]
    public class ScriptObject
    {
        private Window window;
        private ScriptEvent onClickEvent;
 
        public ScriptObject(Window window)
        {
            this.window = window;
            onClickEvent = new ScriptEvent();
        }
 
        public string WindowTitle
        {
            get { return window.Title; }
        }
 
        public double Add2(double num1, double num2)
        {
            return num1 + num2;
        }
 
        public object onClick
        {
            get { return onClickEvent.EventObect; }
            set { onClickEvent.EventObect = value; }
        }
 
        public void OnClick()
        {
            onClickEvent.Execute();
        }

onClick属性对应与Javascript脚本中ScriptObject类的onClick事件。在脚本中可以把一个function实例赋给此类的onClick属性。

因为在javascript中事件并不等同于.net中的事件,具体来说就是javascript中不允许绑定多个事件,所以可以一个事件实现为一个函数对象,通过用com viewer查看System32下的Jscript.dll可以看到,此对象对应于其中的FunctionInstance接口,所以在此就使用了反射构造了这个接口,然后调用其真正的脚本函数。

具体代码下载http://files.cnblogs.com/chinese-zmm/ScriptObjectDemo.rar

最新文章

  1. IE浏览器中Image对象onload失效的解决办法
  2. [原]在AMD机器上使用android studio
  3. C++自定义修饰键,实现如<Capslock+J>等组合键的按键映射
  4. codeforces B. The Fibonacci Segment 解题报告
  5. jsp自定义标签分析
  6. hdu 4417 划分树
  7. SQL Server 的各种查询和要申请的锁
  8. SQL server 表数据改变触发发送邮件
  9. Spring3.2 HelloWorld
  10. ZOJ 1655 FZU 1125 Transport Goods
  11. 小项目:聊天室 (jQuery,PHP,MySQL)
  12. 《剑指offer》整数中1出现的次数
  13. 从零开始一起学习SLAM | 点云到网格的进化
  14. jmeter 报错Error in NonGUIDriver java.lang.IllegalArgumentException: Report generation requires csv output format, check 'jmeter.save.saveservice.output_format' property
  15. day82
  16. 关于php-fpm方式和apache配合使用的几点记录
  17. C++ code:函数指针数组
  18. rhel5.4+oracle 10g rac
  19. Unity3D学习笔记(六):三角函数和点乘
  20. cf-789A (思维)

热门文章

  1. hdu 2454 Degree Sequence of Graph G (推断简单图)
  2. Memcahce(MC)系列(三)Memcached它PHP转让
  3. 于SharePoint经营SharePoint Designer建立
  4. C#之关于时间的整理
  5. LightOJ 1205 Palindromic Numbers
  6. ext3文件系统反删除利器ext3grep应用实战
  7. javascript中间preventDefault与stopPropagation角色介绍
  8. MVC把随机产生的字符串转换为图片
  9. Android 根据规划 Touch 分配和消费机制的事件
  10. crm创建报告补充导航