ActiveX(二)Js 监听 ActiveX中的事件

在上一篇随笔:ActiveX(一)第一个简单的Demo 中,已经可以实现 js 单向调用 ActiveX 中的方法,在很多情况下ActiveX中的方法的执行时相对耗时、耗性能的。在这样的情况下、ActiveX的方法执行会使用异步策略,那么方法异步时,js又如何获取异步执行结果呢?方案无非两种,一种是轮训、一种是Notify。

如果是Notify,Js如何监听其事件呢? 这将是本篇随笔接下来的重点:

继续上一个Demo,假设,技术需求如下:当按回车时、ActiveX将密码框中的密码主动推给Js (使用Notify机制)。

在常规开发中,ActiveX的代码如下即可:

    [Guid("30A3C1B8-9A9A-417A-9E87-80D0EE827658")]
    public partial class PasswordControl : UserControl
    {
        public delegate void NotifyHandler(string pwd);

        /// <summary>
        /// 在js中监听该事件
        /// </summary>
        public event NotifyHandler OnNotify;

        public PasswordControl()
        {
            InitializeComponent();
        }

        public string GetPwd()
        {
            return this.txtPwd.Text;
        }

        private void txtPwd_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((Keys)e.KeyChar == Keys.Enter)
            {
                // 回车 触发事件
                if (this.OnNotify != null)
                {
                    this.OnNotify(this.txtPwd.Text);
                }
            }
        }
    }

我们只需要在 Js 中监听相应的事件、即可完成技术需求。

但是、经过尝试,都无法监听到ActiveX中的事件,于是 Google了一下、 找到了解决方案。

1)添加一个新接口,

2)为新接口添加一个新的GUID,(不能和 PasswordControl 的GUID 相同)

3)添加属性:    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

4)添加 和 需要监听的事件 相同签名的方法。

即,形成如下所示的代码:

    [Guid("FDA0A081-3D3B-4EAB-AE01-6A40FDDA9A60")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IComEvents
    {
        [DispId(0x00000001)]
        void OnNotify(string pwd);
    }

5) 为PasswordControl 添加属性: [ComSourceInterfaces(typeof(IComEvents))]

即、如下所示:

    [ComSourceInterfaces(typeof(IComEvents))]
    [Guid("30A3C1B8-9A9A-417A-9E87-80D0EE827658")]
    public partial class PasswordControl : UserControl
    {
        //... 其他代码
    }    

6)Js端用如下的方式监听事件:

    <script language="Javascript" event="OnNotify(pwd)" for="activieX">
        function activieX::OnNotify(pwd) {
            console.info("密码:" + pwd);
        }
    </script>

event:指定监听的事件

for:指定监听对象

js函数名称使用 :[监听对象]::[监听事件]的形式,注意、中间是两个冒号。

这样,Js就可以在密码框敲回车的时候、接收到ActiveX推送的密码了。 是不是很简单呢?

有两点需要注意:

1、事件所对应的delegate需自定义、不要使用系统的Action<T>

2、js函数名称使用 :[监听对象]::[监听事件]的形式,中间是两个冒号。

测试项目源码:TestActiveX.zip

(未完待续...)

时间: 2024-10-21 12:48:53

ActiveX(二)Js 监听 ActiveX中的事件的相关文章

原生js监听input值改变事件

哈哈哈,又来了,今天闲来无事,实验了下原生js监听input value值改变事件,下面就来说道说道: 本来写监听input值便获是用jquery的,之前的随笔写了,就是这个方法,地址:http://www.cnblogs.com/wteng/p/5434403.html $('input').bind('input propertychange', function() { //to do }) 现在用原生js来实现一遍(其实我翻了下jquery的监听事件on的源码,没找到不知道他写哪了),本

FineReport——JS监听其他控件事件

首先在参数面板和报表中分布添加一个button,用于被监听: 参数面板 控件名:temp: temp点击事件:alert("temp"); 报表 控件名:exprt: temp点击事件:alert("exprt"); 再次在参数面板和报表中添加一个按钮,可不命名: 在参数面板的按钮控件的点击事件中添加如下代码: this.options.form.getWidgetByName("temp").fireEvent('click'); //参数面板

js监听 window.open 关闭事件

转载自:http://blog.csdn.net/hanshileiai/article/details/41346729 首先创建一个新的对象,这将打开一个弹出这样的: var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0'); 为了知道这个弹出窗口关闭,你就必须保持与像下面这样的循环检查这一点: var loop = setInterval(func

js监听页面的scroll事件,当移到底部时触发事件

//页面拉到底时自动加载更多 $(window).scroll(function(event){ var wScrollY = window.scrollY; // 当前滚动条位置 var wInnerH = window.innerHeight; // 设备窗口的高度(不会变) var bScrollH = document.body.scrollHeight; // 滚动条总高度 if (wScrollY + wInnerH >= bScrollH) { showMore(); } });

js 实时监听input中值变化

js 实时监听input中值变化 分类: Javascript2014-05-11 11:13 849人阅读 评论(0) 收藏 举报 [html] view plaincopyprint? <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>RunJS

原 JS监听回车事件

原 JS监听回车事件 发表于2年前(2014-06-04 10:16)   阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦   JS监听某个输入框 ? 1 2 3 4 5 6 7 //回车事件绑定     $('#search_input').bind('keyup', function(event) {         if (event.keyCode == "13") {             //回车

js 监听监键盘动作

主要分四个部分 第一部分:浏览器的按键事件 第二部分:兼容浏览器 第三部分:代码实现和优化 第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型,即keydown,keypress和keyup,它们分别对应onkeydown.  onkeypress和onkeyup这三个事件句柄.一个典型的按键会产生所有这三种事件,依次是keydown,keypress,然后是按键释放时 候的keyup.     在这3种事件类型中,keydown和keyup比较底层,

js监听输入框值的即时变化onpropertychange、oninput

js监听输入框值的即时变化onpropertychange.oninput 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感. 要达到的效果 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.比如即时显示输入框已经被输入的字节数,或者即时读取输入的值来进行搜索引导,也就是google的关联搜索效果等. 只要我们能捕获即时事件就能做到很多事情. 需要了解的知识 首先,我们需要了解onchange和onpropert

JS监听组合按键

有些时候,我们需要在网页上,增加一些快捷按键,方便用户使用一些常用的操作,比如:保存,撤销,复制.粘贴等等. 下面简单梳理一下思路: 我们所熟悉的按键有这么集中类型: 单独的按键操作,如:delete.up.down等 两位组合建,如:ctrl(cmd)+ 其他按键,alt+其他按键,shift+其他按键 三位组合键,如:ctrl(cmd)+ shift + 其他按键,Ctrl(cmd)+ alt + 其他按键 大概只有这么几种情况了,至少我没有见过其他的情况.如果确实存在的话,基本实现的原理也