激活 ActiveX 控件

2016-02-19 12:02 16 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享激活 ActiveX 控件教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - Web开发 】

激活 ActiveX 控件发布日期: 2006-3-29 | 更新日期: 2006-3-29

Internet 开发索引

用户不能与 APPLET、EMBED 或 OBJECT 元素加载的 Microsoft ActiveX 控件直接交互。用户激活这些控件的用户界面后才可以与这些控件交互。本文介绍 Microsoft Internet Explorer 如何处理 ActiveX 控件,显示如何加载 ActiveX 控件才能激活它们的界面,还描述这种行为对辅助工具和宿主 WebBrowser 控件的应用程序的影响。

本主题包含以下部分。

*

本页内容

了解控件激活了解控件激活外部加载交互控件外部加载交互控件以编程方式确定控件是否未激活以编程方式确定控件是否未激活辅助影响辅助影响WebBrowser 控件影响WebBrowser 控件影响附录 A:未激活控件所阻止的 DHTML 事件附录 A:未激活控件所阻止的 DHTML 事件

有关该更新所影响平台的其他信息,请参见Internet Explorer ActiveX 更新。

 

了解控件激活

交互控件 是提供用户界面的 ActiveX 控件。当 Web 页使用 APPLETEMBEDOBJECT 元素加载某个 ActiveX 控件时,该控件的用户界面在用户激活它之前一直是阻止的。如果一个页面使用这些元素加载多个控件,则每个交互控件必须单独激活。

如果某个控件未激活,就会出现以下结果。

与用户交互相关的动态 HTML (DHTML) 事件(如 onblur 和 onclick)被阻止。附录 A 列出控件未激活时受阻的 DHTML 事件。

该控件不响应键盘或鼠标生成的窗口消息,如 WM_CLICK、WM_KEYPRESS 等。

覆盖窗口(创建于控件的 OLE 站点)防止键盘和鼠标消息到达未激活的控件。

创建了一个未激活控件后,Internet Explorer 使用不同技术防止键盘或鼠标窗口消息到达该控件。如果未激活控件是一个有窗口的控件(如 HTML Help 控件),Internet Explorer 使用 EnableWindow 函数禁用这个未激活控件的窗口。当用户激活一个有窗口的控件时,该函数激活禁用的窗口。如果未激活控件是一个无窗口控件(如 Office Web 组件),则该控件的容器会筛选键盘和鼠标消息。

如果某个控件未激活,它不响应用户输入,但执行与交互无关的操作。例如,如果您打开一个使用 Microsoft Windows 媒体播放器播放音乐文件的 Web 页,该页加载后才会播放音乐。只有该控件的用户界面激活后,您才能与 Windows 媒体播放器交互,如下图所示。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

虽然未激活控件不响应任何直接的用户交互;但它们响应脚本命令。

要激活一个交互控件,可以单击该控件,也可以使用 Tab 键将焦点设置在该控件上,然后按 SPACEBAR 或 ENTER 键。从外部脚本加载的交互控件无需激活即可立即响应用户交互。

某些有窗口的控件使用 Windows API 函数(如 GetKeyState 和 GetCursorPos)确定键盘和鼠标的状态,然后响应函数结果。仅对于这些控件而言,先出现一个提示,然后才会在 Internet Explorer 中运行控件。要运行控件,用户需要先单击消息窗口中的按钮,然后页面才会加载。加载后,控件不需要激活。目前,以下控件具有该行为,但供应商正在继续研发没有该行为的新控件。

Virtools™Web Player from Virtools SA

Macromedia Shockwave Player™from Adobe Systems Inc.

QuickTime™from Apple Computer, Inc.

从外部脚本文件加载时,这些控件不显示提示。

下图显示提示对话框。


返回页首返回页首

 

外部加载交互控件

要创建加载交互控件(这些控件立即响应用户输入)的 Web 页,使用 Microsoft JScript 从外部脚本文件加载控件。您不能编写与主 HTML 页内联的脚本元素来从外部加载控件。如果脚本是以编程方式内联编写的(例如,用 writeln 函数),加载的控件就像由 HTML 文档本身加载的一样,需要激活。要确保控件在加载后是交互的,使用以下任一技术。

下面的示例使用 document.write 动态加载控件。

// HTML Filehtml body leftmargin=0 topmargin=0 scroll=no script src="Embed.js"/script /body/html// embed.jsdocument.write(' embed src="examplecontrol"')

外部脚本文件也可以修改某个元素的 outerHTML 属性来达到同样的效果,如下例所示。

// HTML Filehtml body  div  script src="embedControlOuterHTML.js"/script /div /body/html// embedControlOuterHTML.jsembedControlLocation.outerHTML = 'embed src="examplecontrol"';

下一示例使用 document.createElement 加载一个使用 OBJECT 元素的 ActiveX 控件。

重要 使用 createElement 向 Web 页加载 Object 元素或 Embed 元素时,请小心创建该元素,初始化其属性,将该元素添加到页面的 DOM,然后再创建要由该新元素加载的 ActiveX 控件。有关详细信息,请参阅 createElement 文档。

// HTML Filehtml body  div id="DivID"  script src="createElementExplicit.js"/SCRIPT PRE html  body// createElementExplicit.jsvar myObject = document.createElement('object');DivID.appendChild(myObject);myObject.width = "200";myObject.height = "100";myObject.classid= "clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6"; myObject.URL = "example.wmv";myObject.uiMode = "none" ;

下一示例使用 innerHTML 和 JScript 函数加载 ActiveX 控件,同时指定参数值。

// HTML Filehtml head script src="external_script.js" language="JScript" /script /head body div id="EXAMPLE_DIV_ID"  This text will be replaced by the control /div script language="JScript"  CreateControl( "EXAMPLE_DIV_ID", "clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6", "EXAMPLE_OBJECT_ID", "600", "400", "example.wmv", "-1") /script /body/html
// external_script.jsfunction CreateControl(DivID, CLSID, ObjectID,  WIDTH, HEIGHT, URL, AUTOSTART){ var d = document.getElementById(DivID); d.innerHTML =  'object classid=' + CLSID + ' id=' + ObjectID +  ' width=' + WIDTH + ' height=' + HEIGHT +' param name="URL" value=' + URL + ' param name="autoStart" value=' + AUTOSTART + '/';}

由于下一示例使用 writeln 函数将脚本插入原始的 HTML 文档,因此产生的控件需要激活。要加载一个无需激活的控件,请使用上述示例之一。

// HTML Filehtml body  div id="embedControlLocation"  script id="elementid" src="embedControl.js"/script  /div /body/html// embedControl.jsdocument.writeln('script');document.write('document.writeln('');document.write( 'object classid = "clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6" width="100" height="100" /');document.write('');');document.writeln('/script');

警告 如果在控制面板的“Internet 选项”的“高级”选项卡中不选“禁用脚本调试 (Internet Explorer)”选项,则使用这些技术创建的控件仍需激活。

返回页首返回页首

 

以编程方式确定控件是否未激活

您不能使用 JScript 函数或服务器端脚本来确定某个控件是否为激活。宿主 Web 浏览器控件的应用程序不能确定某个控件是否为激活。

控件可以通过 DISPID_AMBIENT_UIDEAD 环境属性确定激活状态,该属性通过 IDispatch::Invoke 调用。该属性通过 IOleControl::OnAmbientPropertyChange 进行更改时,会通知实现 IOleControl 接口的控件。

返回页首返回页首

 

辅助影响

当辅助工具遇到 ActiveX 控件时,可以使用对象的 IAccessible 接口获取有关该控件的信息。可以用 IAccessible::accDoDefaultAction 方法激活未激活的控件。

下表描述在未激活控件上调用 IAccessible 方法产生的结果。

方法说明

IAccessible::accDoDefaultAction

激活控件并在 MSAA 树内公开 ActiveX 控件或 Java Applet。

IAccessible::accHitTest

返回 CHILDID_SELF

IAccessible::accLocation

底层 ActiveX 控件或 Java Applet 的位置

IAccessible::accNavigate

返回 E_NOTIMPL

IAccessible::accSelect

返回 E_NOTIMPL

IAccessible::get_accChild

返回 S_FALSE

IAccessible::get_accChildCount

返回 0 和 S_OK

IAccessible::get_accDefaultAction

返回“Select this control”

IAccessible::get_accDescription

返回 E_NOTIMPL

IAccessible::get_accFocus

返回 E_NOTIMPL

IAccessible::get_accHelp

返回“This control is inactive.Select the control to activate and use it.”

IAccessible::get_accHelpTopic

没有变化 — 返回 E_NOTIMPL

IAccessible::get_accKeyboardShortcut

没有变化 — 委托该对象。如果没有对象,该方法返回 E_NOTIMPL。

IAccessible::get_accName

返回“Inactive Control”

IAccessible::get_accParent

没有变化 — 返回父链中最近的可访问的元素。

IAccessible::get_accRole

返回 ROLE_SYSTEM_PUSHBUTTON

IAccessible::get_accSelection

返回 E_NOTIMPL

IAccessible::get_accState

返回对象的当前状态。该状态总是包括 STATE_SYSTEM_FOCUSABLE

IAccessible::get_accValue

返回 E_NOTIMPL

IAccessible::put_accName

返回 E_NOTIMPL

IAccessible::put_accValue

返回 E_NOTIMPL

有关激活的控件或不需要激活的控件的信息,请参阅 Active Accessibility SDK

辅助工具触发默认操作后应该刷新,这样才能正确显示 ActiveX 控件的数据及其子控件的数据(如果有)。

返回页首返回页首

 

WebBrowser 控件影响

默认情况下,宿主 WebBrowser Control 的自定义应用程序不会阻止由 APPLETEMBEDOBJECT 元素加载的交互式 ActiveX 控件。未激活控件阻止仅应用于以下应用程序。

Windows Explorer

Internet Explorer

MSN Explorer

AOL®Explorer

AOL®8.0

AOL®9.0

CompuServe 2000

AIM®

Maxthon Browser

NetCaptor

Browse3D

Macromedia Dreamweaver

Macromedia Contribute

Netscape®8(将 Internet Explorer 用作呈现引擎时)

要与应用程序中 Internet Explorer 的行为匹配,将 DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 标志添加到 DOCHOSTUIINFO 结构的 dwFlags 参数中,如下例所示。

HRESULT GetHostInfo(DOCHOSTUIINFO *pInfo){ ... pInfo-cbSize = sizeof(DOCHOSTUIINFO); pInfo-dwFlags = { Other DOCHOSTUIFLAGs } |   DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE;  ... return S_OK;}

还可以通过将应用程序的进程名添加到以下注册表项来启用交互控件阻止。

HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)SOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_ENABLE_ACTIVEX_INACTIVATE_MODEprocess_name.exe=(DWORD) 0x00000001

因为用户可以修改注册表,所以 DOCHOSTUIINFO 标志是启用交互控件阻止的首选方法。

默认情况下,应用程序可以注册以并入 ActiveX 控件激活。有关详细信息,请咨询您的技术客户经理或与 Microsoft 的产品支持部门联系。

返回页首返回页首

 

附录 A:未激活控件所阻止的 DHTML 事件

下表列出 ActiveX 控件未激活时所阻止的 DHTML 事件。

onactivate

ondragleave

onmouseout

onbeforeactivate

ondragover

onmouseover

onbeforecopy

ondragstart

onmouseup

onbeforecut

ondrop

onmousewheel

onbeforedeactivate

onfocus

onmove

onbeforepaste

onfocusin

onmoveend

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

onblur

onfocusout

onmovestart

onclick

onhelp

onpage

oncontextmenu

onkeydown

onpaste

oncontrolselect

onkeypress

onresize

oncopy

onkeyup

onresizeend

oncut

onlosecapture

onresizestart

ondblclick

onmousedown

onscroll

ondeactivate

onmouseenter

onselectstart

ondragend

onmouseleave

-

ondragenter

onmousemove

-

来源:https://www.tulaoshi.com/n/20160219/1599592.html

延伸阅读
如果你希望用C++来写ActiveX®控件,有两个流行的框架,一个是Microsoft® Foundation Classes (MFC),另一个是ATL。我将深入的解释这两种框架对开发ActiveX控件所提供的支持,帮助你更好的决定哪种模型最适合你的开发环境和需求。 ActiveX 控件的完全形态 ActiveX控件基于构件对象模型COM,使得ActiveX控件成为可能...
template class CToolbar { public: CToolbar(); void CreateToolbar(HWND hParent);// 创建工具条 void AddButtons();// 逐个加入按钮 void DestroyToolbar();// 撤消工具条 LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&); // 工具条上按钮的提示信息 protected: ...
最近为了解决一个ActiveX的技术问题,用VB做了一个ActiveX控件,什么功能都没有, 就是测试一下ActiveX的发布,以及版本更新!折腾了两天,总算搞明白其中的一些过程! 顺便记一下,免得忘记!看过一篇文章,介绍了用C#来开发ActiveX的功能,但是C#只能 做托管的程序,需要.net framework在客户端安装后,才能运行!所以,我最终开发,还是 ...
參考決定或改作通用的activeX控件. (1)新建一ActiveX Control工程. 放置一maskedit控件於上. 其設置屬性參考如下: usercontrol之name:DataDate. usercontrol之DataBindingBehavior設定1-VvbSimpleBound MaskedtBox之name:mskDate. (2).新增一數據屬性用於綁定.操作如下(我用為繁體系統,可能說法不大...
标签: ASP
  1. 什么是ActiveX 控件? Microsoft® ActiveX™ 控件是由软件提供商开发的可重用的软件组件。使用 ActiveX控件,可以很快地在网址、台式应用程序、以及开发工具中加入特殊的功能。例如,StockTicker控件可以用来在网页上即时地加入活动信息,动画控件可用来向网页中加入动画特性。 现在,已有1000多个商用的ActiveX控...

经验教程

863

收藏

35
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部