用户无法直接与 APPLET、EMBED 或 OBJECT 元素加载的 Microsoft ActiveX 控件交互。 用户激活这些控件的用户界面后才可以与这些控件交互。 本主题介绍了 Microsoft Internet Explorer 如何处理 ActiveX 控件,显示如何加载 ActiveX 控件才能激活它们的界面,并且说明了此行为对辅助工具以及托管 WebBrowser 控件的应用程序的影响。(本文章还包含指向英文网页的链接。)
此主题包含以下部分。
本页内容
了解控件激活 | |
外部加载交互控件 | |
以编程的方式确定控件是否未激活 | |
协助影响 | |
WebBrowser 控件影响 | |
附录 A: 未激活控件阻止的 DHTML 事件 |
有关用户体验的介绍,请参阅 Internet Explorer 6: ActiveX 更新。
有关该更新所影响平台的其他信息,请参阅 Internet Explorer ActiveX 更新。
了解控件激活
交互控件是提供用户界面的 ActiveX 控件。 当网页使用 APPLET、EMBED 或 OBJECT 元素加载某个 ActiveX 控件时,此控件的用户界面会受阻,直到用户将其激活为止。 如果页面使用上述元素加载多个控件,则必须单独激活每个交互控件。
如果某个控件未激活,就会出现下列结果。
• |
会阻止与用户交互相关的动态 HTML (DHTML) 事件(如 onblur 和 onclick)。 附录 A 列出了未激活控件时受阻的 DHTML 事件。 |
• |
此控件不响应键盘或鼠标生成的窗口消息(如 WM_CLICK 和 WM_KEYPRESS 等)。 |
• |
覆盖窗口(创建于控件的 OLE 站点)防止键盘和鼠标消息到达未激活的控件。 |
创建未激活的控件时,Internet Explorer 使用不同的技术来防止键盘或鼠标窗口消息到达此控件。 如果未激活的控件是有窗口的控件(如 HTML 帮助控件),Internet Explorer 会使用 EnableWindow 函数禁用未激活控件的窗口。 用户激活有窗口的控件时,该函数会激活禁用的窗口。 如果未激活控件是一个无窗口的控件(如 Office Web 组件),则该控件的容器会筛选键盘和鼠标消息。
未激活控件时,它不响应用户输入;但是,它确实会执行交互无关的操作。 例如,如果打开使用 Microsoft Windows 媒体播放器播放音乐文件的网页,则在此页面加载后才会播放音乐。 在激活控件的用户界面之前,无法与 Windows 媒体播放器交互,如下图所示。
注意:虽然未激活的控件不响应直接的用户交互;但它们响应脚本命令。
要激活交互控件,可以单击该控件,或使用 TAB 键将焦点设置在该控件上,然后按空格键或 ENTER 键。 从外部脚本加载的交互控件无需激活即可立即响应用户交互。
一些有窗口的控件使用 Windows API 函数(如 GetKeyState 和 GetCursorPos)来确定键盘和鼠标的状态,然后响应函数结果。 仅对于这些控件而言,先出现一个提示,然后才会在 Internet Explorer 中运行控件。 要运行控件,用户需要先单击消息窗口中的按钮,然后页面才会加载。 在加载后,控件不需要激活。 目前,以下控件具有该行为,但供应商正在继续研发没有该行为的新控件。
• |
Virtools SA 的 Virtools (TM) Web Player |
• |
Adobe Systems Inc. 的 Macromedia Shockwave Player (TM) |
• |
Apple Computer, Inc. 的 QuickTime (TM) |
从外部脚本文件加载时,这些控件不显示提示。
下图显示提示对话框。
外部加载交互控件
要创建加载交互控件(立即响应用户输入)的网页,请使用 Microsoft JScript 从外部脚本文件加载控件。 无法编写与主 HTML 页面内联的脚本元素来从外部加载控件。 如果脚本是以编程方式内联编写的(例如,使用 writeln 函数),加载的控件就像由 HTML 文档本身加载的一样,需要激活。 要确保加载控件时它是交互的,请使用下列方法之一从外部文件加载控件。
下列示例使用 document.write 动态加载控件。
<!-- HTML 文件 --> <html> <body leftmargin=0 topmargin=0 scroll=no> <script src="docwrite.js"></script> </body> </html> // docwrite.js document.write('<object classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6">'); document.write('<param name="URL" value="example.wmv">'); document.write('<param name="autoStart" value="-1"></object>');
外部脚本文件也可以修改元素的 outerHTML 属性来达到同样的效果,如下例所示。
<!-- HTML 文件 --> <html> <body> <div id="embedControlLocation"> <script src="embedControlOuterHTML.js"></script> </div> </body> </html> // outerhtml.js embedControlLocation.outerHTML = '<embed src="examplecontrol">';
下面的示例使用 document.createElement 加载使用 OBJECT 元素的 ActiveX 控件。
注意:使用 createElement 向网页加载 Object 元素或 Embed 元素时,请小心创建该元素,初始化其属性,将该元素添加到页面的 DOM,然后再创建要由该新元素加载的 ActiveX 控件。 有关详细信息,请参阅 createElement 文档。
<!-- HTML 文件 --> <html> <body> <div id="DivID"> <script src="createElementExplicit.js"></script> </div> </body> </html> // createElementExplicit.js var 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 文件 --> <html> <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.js function 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 文件 --><html> <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>');
注意:要自动激活 ActiveX 控件,Internet Explorer 必须使用 2003 年 9 月 30 日以后的 vbscript.dll 和 jscript.dll 版本。此 DLL 的早期版本需要激活所有控件,与从网页加载它们的机制无关。 有关 vbscript.dll 和 jscript.dll 库的当前版本,请参阅 Windows Script 下载。
以编程的方式确定控件是否未激活
无法使用 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 控件的自定义应用程序不阻止由 APPLET、EMBED 或 OBJECT 元素加载的 ActiveX 控件。 未激活控件阻止仅应用于以下应用程序。
• |
Windows Explorer |
• |
Internet Explorer |
• |
MSN Explorer |
• |
AOL® Explorer |
• |
AOL® 8.0 |
• |
AOL® 9.0 |
• |
CompuServe 2000 |
• |
AIM® |
• |
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) SOFTWARE Microsoft Internet Explorer Main FeatureControl FEATURE_ENABLE_ACTIVEX_INACTIVATE_MODE process_name.exe=(DWORD) 0x00000001
注意:因为用户可以修改注册表,所以 DOCHOSTUIINFO 标志是启用交互控件阻止的首选方法。
默认情况下,应用程序可以注册以并入 ActiveX 控件激活。 有关详细信息,请咨询您的技术客户经理或与 Microsoft 的产品支持部门联系。
附录 A: 未激活控件阻止的 DHTML 事件
下表列出 ActiveX 控件未激活时所阻止的 DHTML 事件。
© 2007 Microsoft Corporation 版权所有。保留所有权利。使用规定。
返回页首
转载说明
作者:来自微软MSDN相关文章
网址:本文引用自http://www.microsoft.com/china/MSDN/library/NetComm/activating_activex.mspx?mfr=true
作者对转载者要求说明(以下简称本说明):
1、确保您已经遵守了《中华人民共和国信息网络传播权保护条例》,且必须遵守《刚刚网络作品版权声明》(若两文件有冲突内容以《中华人民共和国信息网络传播权保护条例》为准,但其他非冲突内容依然各自有效),再转载。
2、“本说明、作者、作者博客网址及作者博客坐落,本文中提及的各种说明、备注或附录性文字”必须被转载,且不得改变其原有内容和要表达的意图!
作者:刚刚 作者博客网址:http://lijigang.cnblogs.com/ 作者博客坐落在博客园
把握现实生活,培养自身能力
掌握新型技术,提高自我力量