激活 ActiveX 控件


Posted in Javascript onOctober 09, 2006

激活 ActiveX 控件

发布日期: 2006-3-29 | 更新日期: 2006-3-29

Internet 开发索引

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

本主题包含以下部分。

激活 ActiveX 控件

 

 

本页内容

了解控件激活
外部加载交互控件
以编程方式确定控件是否未激活
辅助影响
WebBrowser 控件影响
附录 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 媒体播放器交互,如下图所示。

 

激活 ActiveX 控件

 

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

要激活一个交互控件,可以单击该控件,也可以使用 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.

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

下图显示提示对话框。

 

激活 ActiveX 控件

 

激活 ActiveX 控件返回页首

 

外部加载交互控件

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

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

// HTML File
<html>
 <body leftmargin=0 topmargin=0 scroll=no>
 <script src="Embed.js"></script>
 </body>
</html>
// embed.js
document.write(' <embed src="examplecontrol">')

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

// HTML File
<html>
 <body> 
 <div>
  <script src="embedControlOuterHTML.js"></script>
 </div>
 </body>
</html>
// embedControlOuterHTML.js
embedControlLocation.outerHTML = '<embed src="examplecontrol">';

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

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

// HTML File
<html>
 <body> 
 <div id="DivID">
  <script src="createElementExplicit.js"></SCRIPT> PRE html>< < body>>
// 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 File
<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 File
<html>
 <body> 
 <div id="embedControlLocation">
  <script id="elementid" src="embedControl.js"></script> 
 </div>
 </body>
</html>
// embedControl.js
document.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)”选项,则使用这些技术创建的控件仍需激活。

激活 ActiveX 控件返回页首

 

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

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

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

激活 ActiveX 控件返回页首

 

辅助影响

当辅助工具遇到 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 控件的数据及其子控件的数据(如果有)。

激活 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)
SOFTWARE
Microsoft
Internet Explorer
Main
FeatureControl
FEATURE_ENABLE_ACTIVEX_INACTIVATE_MODE
process_name.exe=(DWORD) 0x00000001

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

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

激活 ActiveX 控件返回页首

 

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

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

onactivate ondragleave onmouseout
onbeforeactivate ondragover onmouseover
onbeforecopy ondragstart onmouseup
onbeforecut ondrop onmousewheel
onbeforedeactivate onfocus onmove
onbeforepaste onfocusin onmoveend
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 -
Javascript 相关文章推荐
jQuery AjaxQueue改进步骤
Oct 06 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
javascript对中文按照拼音排序代码
Aug 20 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
Angularjs Promise实例详解
Mar 15 Javascript
Redux实现组合计数器的示例代码
Jul 04 Javascript
详解Require.js与Sea.js的区别
Aug 05 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
express.js中间件说明详解
Mar 19 Javascript
Js跳出两级循环方法代码实例
Sep 22 Javascript
自动更新作用
Oct 08 #Javascript
许愿墙中用到的函数
Oct 07 #Javascript
解放web程序员的输入验证
Oct 06 #Javascript
通过ifame指向的页面高度调整iframe的高度
Oct 05 #Javascript
javascript字典探测用户名工具
Oct 05 #Javascript
TFDN图片播放器 不错自动播放
Oct 03 #Javascript
DOM精简教程
Oct 03 #Javascript
You might like
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
AngularJS快速入门
2015/04/02 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
Python中time模块和datetime模块的用法示例
2016/02/28 Python
python使用str &amp; repr转换字符串
2016/10/13 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
python各种excel写入方式的速度对比
2020/11/10 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
什么是lambda函数
2013/09/17 面试题
应届毕业生个人自荐信范文
2013/11/30 职场文书
校园广播稿精选
2014/10/01 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
股东大会通知
2015/04/24 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python