1. 程式人生 > >解決OCX (ActiveX)事件註冊IE事件回撥

解決OCX (ActiveX)事件註冊IE事件回撥

OCX在事件註冊方面C#版本一般實現可能有問題——光使用事件代理註冊事件是不行的,需要註冊允許COM通訊。

引文講述

In IE11, the attachEvent has been dropped in favour of addEventListener.

Nevertheless, when I replace all the attachEvent instances that were used to bind to events triggered by the activeX, such events are no longer triggered.

Here are some html code examples that illustrate the problem.

(I have created a simple activeX based on an MFC activeX control that simply triggers an event inside OnCreate. This event sends 2 strings as parameters. If you need the code or even the ocx file for the activeX, please let me know.)

Test 1:

<!DOCTYPE html><html><head><title>TestEvent Example HTML</title><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="description"content=""><metaname="viewport"content="width=device-width, initial-scale=1"><scriptlanguage
='javascript'for="testAxEvent"event="testEvent(szType, szValue)">// Test 1 - statically load the script (This is the basis for the hack)// Works on IE8, IE9, IE10 and IE11var MSG = document.getElementById("msg"); MSG.innerHTML = szType +" : "+ szValue;</script></head><body><table><tr><td><OBJECTID='testAxEvent'CLASSID='CLSID:BA19A985-C93E-491B-B801-2EB7F903C8CE'codebase="testAxEvent.cab"></OBJECT></td></tr><tr><tdheight='30'></td></tr><tr><tdalign=center><fontsize=5><divid='msg'></div></font></tr></table></body></html>

Test 2:

<!DOCTYPE html><html><head><title>TestEvent Example HTML</title><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="description"content=""><metaname="viewport"content="width=device-width, initial-scale=1"></head><body><table><tr><td><OBJECTID='testAxEvent'CLASSID='CLSID:BA19A985-C93E-491B-B801-2EB7F903C8CE'codebase="testAxEvent.cab"width='120'height='80'></OBJECT></td></tr><tr><tdheight='30'></td></tr><tr><tdalign=center><fontsize=5><divid='msg'></div></font></tr></table></body><script>// Test 2 - attachEvent// Works on IE8, IE9 and IE10// Does not work on IE11function onTestEvent(szType, szValue){var MSG = document.getElementById("msg");
			MSG.innerHTML = szType +" : "+ szValue;}var elem = document.getElementById("testAxEvent");
		elem.attachEvent("testEvent", onTestEvent);</script></html>

Test 3:

<!DOCTYPE html><html><head><title>TestEvent Example HTML</title><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="description"content=""><metaname="viewport"content="width=device-width, initial-scale=1"></head><body><table><tr><td><OBJECTID='testAxEvent'CLASSID='CLSID:BA19A985-C93E-491B-B801-2EB7F903C8CE'codebase="testAxEvent.cab"width='120'height='80'></OBJECT></td></tr><tr><tdheight='30'></td></tr><tr><tdalign=center><fontsize=5><divid='msg'></div></font></tr></table></body><script>function onTestEvent(szType, szValue){var MSG = document.getElementById("msg");
			MSG.innerHTML = szType +" : "+ szValue;}var elem = document.getElementById("testAxEvent");// Test 3 - addEventListener// Does not work on IE11 !
		elem.addEventListener("testEvent", onTestEvent,true);
		elem.addEventListener("testEvent", onTestEvent,false);</script></html>

Test 1 uses the "for" tag to setup the callback to the activeX event. This is successful on all versions IE8, 9, 10 and 11.

Test 2 uses attachEvent to bind the callback to the object element. The callback is correctly called on IE8, 9 and 10 but not on IE11, as was expected.

Test 3 replaces attachEvent with addEventListener. Still the event is not triggered on IE11.

What am I missing here? Am I not using the correct addEventListener syntax? Does addEventListener supports binding to activeX events at all? Do I need to make changes to the calling conventions on the activeX side?

解決方案

下面說一下關鍵步驟:

1、生產自己的ActiveX控制元件,相關的Guid需要注意。

2、定義自定義事件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace CvNetVideo.Event
{
   
    /// <summary>
    /// 全屏事件代理
    /// </summary>
    public delegate void FullScreenEvent(bool isFullScreen);

    /// <summary>
    /// 直播結束事件代理
    /// </summary>
    public delegate void RealTimeLiveAllStopEvent();

    /// <summary>
    /// 控制元件雙擊事件代理
    /// </summary>
    public delegate void ControlDoubleClickEvent(bool isFullScreen);


    [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ControlEvents
    {
        [DispIdAttribute(0x001)]
        void OnFullScreenEvent(bool isFullScreen);
        [DispIdAttribute(0x002)]
        void OnRealTimeLiveAllStopEvent();
        [DispIdAttribute(0x003)]
        void OnControlDoubleClickEvent(bool isFullScreen);
    }
}

3、控制元件註冊引用COM

 [Guid("2769FF99-A41F-4AC4-99AD-9CABEB8F83D4")]
    //指示應用該屬性的物件對COM可見
    [ComVisible(true)]
    //將事件接收介面連線到託管類
    [ComSourceInterfacesAttribute(typeof(ControlEvents))]
    public partial class UCVideo : ActiveXControl, ACDCallBack, ChejiCallBack, MPlayerCallBack
    {
        #region 控制元件與IE代理事件
        // 全屏或退出全屏事件
        public event FullScreenEvent OnFullScreenEvent;
        // 直播退出事件
        public event RealTimeLiveAllStopEvent OnRealTimeLiveAllStopEvent;
        // 控制元件雙擊事件
        public event ControlDoubleClickEvent OnControlDoubleClickEvent;
        #endregion

4、引用例項

 /// <summary>
        /// 全屏或關閉全屏(IE控制全屏)
        /// </summary>
        /// <param name="isFullScreen"></param>
        /// <returns></returns>
        public bool FullScreen(bool isFullScreen)
        {
            // 操作全屏或關閉全屏
            OpenOrCloseFullScreen(isFullScreen);
            // 全屏事件回撥註冊
            OnFullScreenEvent?.Invoke(isFullScreen);
            return isFullScreen;
        }

5、IE呼叫註冊事件

 <object id="cSharpActiveX" classid="clsid:2769FF99-A41F-4AC4-99AD-9CABEB8F83D4"></object>

    <script language="javascript" for="cSharpActiveX" event="OnFullScreenEvent(isFullScreen)" type="text/javascript">
        alert(isFullScreen ? "全屏事件" : "退出全屏事件");
    </script>
MFC可以參考:https://blog.csdn.net/wu_tongyu/article/details/39530349

相關推薦

解決OCX ActiveX事件註冊IE事件

OCX在事件註冊方面C#版本一般實現可能有問題——光使用事件代理註冊事件是不行的,需要註冊允許COM通訊。引文講述 In IE11, the attachEvent

爬蟲技術05神箭手爬蟲函式

回撥函式是在神箭手應用爬取並處理網頁的過程中設定的一些系統鉤子, 通過這些鉤子可以完成一些特殊的處理邏輯. 回撥函式需要設定到configs物件中才起作用 下圖是採集爬蟲爬取並處理網頁的流程圖, 矩形方框中標識了採集爬蟲執行過程中所使用的重要回調函式:

Java—內部類—實現閉包與

前言: Java的閉包與回撥我也是第二次接觸這個概念,之前在自學Android的時候繪製View很多地方都用到了監聽器回撥,一直不是很明白,現在回頭鞏固Java的基礎總算的弄明白,儘量用我自己理解的語言來和大家分享,希望對不懂的朋友可以有一定的幫助,大神也可以

Nginx學習之路Nginx中的事件驅動過程詳解-----connection事件註冊過程

在上一篇文章Nginx學習之路(八)Nginx中的事件驅動過程詳解-----以listenfd註冊過程為例中舉了listenfd的註冊過程來說明事件驅動中的事件註冊過程,這是一個簡單的過程,今天來說明下當瀏覽器發起一個http請求時,nginx是如何將這個事件註冊到epoll

Nginx學習之路Nginx中的事件驅動過程詳解-----以listenfd註冊過程為例

Nginx的高效得益於它的事件驅動機制,整個事件驅動機制基本框架就是linux下的select,poll,epoll這幾個IO多路複用模式,但是nginx絕不單單只是使用它們這麼簡單,今天以epoll模式為例,從nginx最開始的listenfd的監聽的過程來說明nginx是

vs2010開發activexMFC控制元件/ie外掛(二)

vs2010開發activex(MFC)控制元件/ie外掛(二):js傳引數          js傳引數給activex控制元件。  過程為:js變數通過activex類的屬性傳遞進來給對話

C#進階系列——WebApi 異常處理解決方案

機制 輸出 ges 如果 但是 rom lba slist 解決 出處:http://www.cnblogs.com/landeanfen/p/5363846.html 閱讀目錄 一、使用異常篩選器捕獲所有異常 二、HttpResponseException自

項目中遇到的某些問題及解決辦法

sql () 輸入 包含 查看 定位 管理器 顯示 分布式開發 簡介 該博文記錄了一些平時在工作中遇到的問題及解決辦法,某些問題有解決辦法,某些問題暫時沒有解決辦法,如果有大神知道的,請多多指點。 如果某些問題有更好的解決辦法,也請指教。 正文 1、在一個方

學習MVC之租房網站- 前臺註冊和登錄

設置 rup 密碼錯誤 發送短信 mvc 短信驗證 ont 上傳 錯誤 在上一篇<學習MVC之租房網站(七)-房源管理和配圖上傳>完成了在後臺新增、編輯房源信息以及上傳房源配圖的功能。到此後臺開發便告一段落了,開始實現前臺的功能,也是從用戶的登錄、註冊開始。 前

Android自動化測試遇到的問題及解決方法1

粘貼 png family 學習 再次 jmeter log 初始 mage 編者按:本文是小小小提姆在使用自動化測試工具TestWriter時的一點使用心得~我叫小小小提姆,是一名在IT行業的洪流中力爭上遊的軟件測試員,個人軟件測試擅長方向:1、功能測試(熟悉Fiddle

Uber使用Swift重寫APP的踩坑經歷及解決方案轉載

result 框架 退出 帶來 hole 懶漢 將在 例子 穩定 本文出自Uber移動架構和框架組負責人托馬斯·阿特曼於2016年在灣區Swift峰會上的演講,分享了使用Swfit重寫Uber的好與壞。以下為譯文: 我是托馬斯·阿特曼,目前是Uber移動架構和框架組負責人。

如何設計成功而有價值的數據可視化解決方案

同時 right 讀者 有助於 動效 講解 思考 bsp jpg 上篇關於如何設計成功而有價值的數據可視化解決方案,我們已經就規劃方案的思路這一大版塊展開了詳細的講解,本篇繼續幹貨放送,分享下方案的可視化展示該如何進行設計?僅僅只需要好看就可以了嗎?如果不是又該註意些什麽?

【轉】bash: ssh: command not found解決方法linux

inux 配置 pan html clas client oop post bash 原文轉自:http://www.cnblogs.com/ahauzyy/archive/2013/04/25/3043699.html 今天在搭建hadoop的開發環境中,用的是ce

HTTP 錯誤 500.21 - Internal Server Error 解決方案

san 原因 cal 方案 發生 err 檢查 net tle 不久前重新安裝了Windows7,在安裝了VS2010 開發平臺之後,將網站發布到IIS,訪問發生如下錯誤: HTTP 錯誤 500.21 - Internal Server Error處理程序“NickLee

Loadrunner之https協議錄制放報錯如何解決

文件 error 有一個 實現 run img 路徑 命令 tin 一、錄制中遇到報錯27778的問題(如下圖1),即關於錄制的鏈接為https開頭的問題,分兩個步驟解決,如下: 圖1 https訪問報錯解決步驟如下: 1.修改Vuser-->Run-time Se

關於Android滑動沖突的解決方法

頂部 ole onscroll googl mea tracking see doc 特性 之前的一遍學習筆記主要就Android滑動沖突中,在不同方向的滑動所造成沖突進行了了解,這樣的沖突非常easy理解,當然也非常easy解決。今天,就同方向的滑動所

解決Eclipse狂吃內存的解決方法

too options 占用 退出 eclipse cli 文件 釋放 org 解決Eclipse狂吃內存的解決方法(轉) 1、在eclipse的安裝路徑下建一個文件叫options,千萬別又擴展名,然後添加內容如下: org.eclipse.ui/p

msdia80.dll文件出現在磁盤根目錄下的解決方案

磁盤 har mic http comm 管理員 ges sdi AMF 情況描述: 當安裝某些軟件後,磁盤根目錄中多出了msdia80.dll文件,該文件顯示為2006年12月1日,884KB。 原因:  當使用64位操作系統時,在電腦上安裝 Micro

銀河麒麟操作系統常見問題及解決方法

更換 架構 ash 信息技術 .cn 計算 科技 安裝問題 cti 銀河麒麟操作系統常見問題及解決方法(四) ——激活問題 銀河麒麟操作系統是國防科大唯一授權給天津麒

Dubbo框架應用之--Zookeeper註冊中心、管理控制臺的安裝及解說

root pan rda 查詢 bsp err 封裝 form keep 我是在linux下使用dubbo-2.3.3以上版本號的zookeeper註冊中心客戶端。Zookeeper是Apache Hadoop的子項目,強度相對較好,建議生產環境使用該註冊中