激活 ActiveX 控件
激活 ActiveX 控件
用戶不能與 APPLET、EMBED 或 OBJECT 元素加載的 Microsoft ActiveX 控件直接交互。用戶激活這些控件的用戶界面后才可以與這些控件交互。本文介紹 Microsoft Internet Explorer 如何處理 ActiveX 控件,顯示如何加載 ActiveX 控件才能激活它們的界面,還描述這種行為對輔助工具和宿主 WebBrowser 控件的應(yīng)用程序的影響。
本主題包含以下部分。
本頁內(nèi)容
| 了解控件激活 | |
| 外部加載交互控件 | |
| 以編程方式確定控件是否未激活 | |
| 輔助影響 | |
| WebBrowser 控件影響 | |
| 附錄 A:未激活控件所阻止的 DHTML 事件 |
有關(guān)該更新所影響平臺的其他信息,請參見Internet Explorer ActiveX 更新。
了解控件激活
交互控件 是提供用戶界面的 ActiveX 控件。當(dāng) Web 頁使用 APPLET、EMBED 或 OBJECT 元素加載某個 ActiveX 控件時(shí),該控件的用戶界面在用戶激活它之前一直是阻止的。如果一個頁面使用這些元素加載多個控件,則每個交互控件必須單獨(dú)激活。
如果某個控件未激活,就會出現(xiàn)以下結(jié)果。
| • |
與用戶交互相關(guān)的動態(tài) HTML (DHTML) 事件(如 onblur 和 onclick)被阻止。附錄 A 列出控件未激活時(shí)受阻的 DHTML 事件。 |
| • |
該控件不響應(yīng)鍵盤或鼠標(biāo)生成的窗口消息,如 WM_CLICK、WM_KEYPRESS 等。 |
| • |
覆蓋窗口(創(chuàng)建于控件的 OLE 站點(diǎn))防止鍵盤和鼠標(biāo)消息到達(dá)未激活的控件。 |
創(chuàng)建了一個未激活控件后,Internet Explorer 使用不同技術(shù)防止鍵盤或鼠標(biāo)窗口消息到達(dá)該控件。如果未激活控件是一個有窗口的控件(如 HTML Help 控件),Internet Explorer 使用 EnableWindow 函數(shù)禁用這個未激活控件的窗口。當(dāng)用戶激活一個有窗口的控件時(shí),該函數(shù)激活禁用的窗口。如果未激活控件是一個無窗口控件(如 Office Web 組件),則該控件的容器會篩選鍵盤和鼠標(biāo)消息。
如果某個控件未激活,它不響應(yīng)用戶輸入,但執(zhí)行與交互無關(guān)的操作。例如,如果您打開一個使用 Microsoft Windows 媒體播放器播放音樂文件的 Web 頁,該頁加載后才會播放音樂。只有該控件的用戶界面激活后,您才能與 Windows 媒體播放器交互,如下圖所示。

注 雖然未激活控件不響應(yīng)任何直接的用戶交互;但它們響應(yīng)腳本命令。
要激活一個交互控件,可以單擊該控件,也可以使用 Tab 鍵將焦點(diǎn)設(shè)置在該控件上,然后按 SPACEBAR 或 ENTER 鍵。從外部腳本加載的交互控件無需激活即可立即響應(yīng)用戶交互。
某些有窗口的控件使用 Windows API 函數(shù)(如 GetKeyState 和 GetCursorPos)確定鍵盤和鼠標(biāo)的狀態(tài),然后響應(yīng)函數(shù)結(jié)果。僅對于這些控件而言,先出現(xiàn)一個提示,然后才會在 Internet Explorer 中運(yùn)行控件。要運(yùn)行控件,用戶需要先單擊消息窗口中的按鈕,然后頁面才會加載。加載后,控件不需要激活。目前,以下控件具有該行為,但供應(yīng)商正在繼續(xù)研發(fā)沒有該行為的新控件。
| • |
Virtools™Web Player from Virtools SA |
| • |
Macromedia Shockwave Player™from Adobe Systems Inc. |
| • |
QuickTime™from Apple Computer, Inc. |
從外部腳本文件加載時(shí),這些控件不顯示提示。
下圖顯示提示對話框。

外部加載交互控件
要創(chuàng)建加載交互控件(這些控件立即響應(yīng)用戶輸入)的 Web 頁,使用 Microsoft JScript 從外部腳本文件加載控件。您不能編寫與主 HTML 頁內(nèi)聯(lián)的腳本元素來從外部加載控件。如果腳本是以編程方式內(nèi)聯(lián)編寫的(例如,用 writeln 函數(shù)),加載的控件就像由 HTML 文檔本身加載的一樣,需要激活。要確保控件在加載后是交互的,使用以下任一技術(shù)。
下面的示例使用 document.write 動態(tài)加載控件。
// 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 屬性來達(dá)到同樣的效果,如下例所示。
// 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 元素時(shí),請小心創(chuàng)建該元素,初始化其屬性,將該元素添加到頁面的 DOM,然后再創(chuàng)建要由該新元素加載的 ActiveX 控件。有關(guān)詳細(xì)信息,請參閱 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 函數(shù)加載 ActiveX 控件,同時(shí)指定參數(shù)值。
// 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 函數(shù)將腳本插入原始的 HTML 文檔,因此產(chǎn)生的控件需要激活。要加載一個無需激活的控件,請使用上述示例之一。
// 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 選項(xiàng)”的“高級”選項(xiàng)卡中不選“禁用腳本調(diào)試 (Internet Explorer)”選項(xiàng),則使用這些技術(shù)創(chuàng)建的控件仍需激活。
以編程方式確定控件是否未激活
您不能使用 JScript 函數(shù)或服務(wù)器端腳本來確定某個控件是否為激活。宿主 Web 瀏覽器控件的應(yīng)用程序不能確定某個控件是否為激活。
控件可以通過 DISPID_AMBIENT_UIDEAD 環(huán)境屬性確定激活狀態(tài),該屬性通過 IDispatch::Invoke 調(diào)用。該屬性通過 IOleControl::OnAmbientPropertyChange 進(jìn)行更改時(shí),會通知實(shí)現(xiàn) IOleControl 接口的控件。
輔助影響
當(dāng)輔助工具遇到 ActiveX 控件時(shí),可以使用對象的 IAccessible 接口獲取有關(guān)該控件的信息??梢杂?IAccessible::accDoDefaultAction 方法激活未激活的控件。
下表描述在未激活控件上調(diào)用 IAccessible 方法產(chǎn)生的結(jié)果。
| 方法 | 說明 |
|
IAccessible::accDoDefaultAction |
激活控件并在 MSAA 樹內(nèi)公開 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 |
返回對象的當(dāng)前狀態(tài)。該狀態(tài)總是包括 STATE_SYSTEM_FOCUSABLE |
|
IAccessible::get_accValue |
返回 E_NOTIMPL |
|
IAccessible::put_accName |
返回 E_NOTIMPL |
|
IAccessible::put_accValue |
返回 E_NOTIMPL |
有關(guān)激活的控件或不需要激活的控件的信息,請參閱 Active Accessibility SDK。
注 輔助工具觸發(fā)默認(rèn)操作后應(yīng)該刷新,這樣才能正確顯示 ActiveX 控件的數(shù)據(jù)及其子控件的數(shù)據(jù)(如果有)。
WebBrowser 控件影響
默認(rèn)情況下,宿主 WebBrowser Control 的自定義應(yīng)用程序不會阻止由 APPLET、EMBED 或 OBJECT 元素加載的交互式 ActiveX 控件。未激活控件阻止僅應(yīng)用于以下應(yīng)用程序。
| • |
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 用作呈現(xiàn)引擎時(shí)) |
要與應(yīng)用程序中 Internet Explorer 的行為匹配,將 DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 標(biāo)志添加到 DOCHOSTUIINFO 結(jié)構(gòu)的 dwFlags 參數(shù)中,如下例所示。
HRESULT GetHostInfo(DOCHOSTUIINFO *pInfo)
{
...
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
pInfo->dwFlags = { Other DOCHOSTUIFLAGs } |
DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE;
...
return S_OK;
}
還可以通過將應(yīng)用程序的進(jìn)程名添加到以下注冊表項(xiàng)來啟用交互控件阻止。
HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER) SOFTWARE Microsoft Internet Explorer Main FeatureControl FEATURE_ENABLE_ACTIVEX_INACTIVATE_MODE process_name.exe=(DWORD) 0x00000001
注 因?yàn)橛脩艨梢孕薷淖员?,所?DOCHOSTUIINFO 標(biāo)志是啟用交互控件阻止的首選方法。
默認(rèn)情況下,應(yīng)用程序可以注冊以并入 ActiveX 控件激活。有關(guān)詳細(xì)信息,請咨詢您的技術(shù)客戶經(jīng)理或與 Microsoft 的產(chǎn)品支持部門聯(lián)系。
附錄 A:未激活控件所阻止的 DHTML 事件
下表列出 ActiveX 控件未激活時(shí)所阻止的 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 |
- |
相關(guān)文章
利用H5api實(shí)現(xiàn)時(shí)鐘的繪制(javascript)
這篇文章主要為大家詳細(xì)介紹了利用H5api實(shí)現(xiàn)時(shí)鐘的繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
JS使用canvas繪制旋轉(zhuǎn)風(fēng)車動畫
這篇文章主要為大家詳細(xì)介紹了JS使用canvas繪制旋轉(zhuǎn)風(fēng)車動畫,有加速減速啟動停止功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
原生JS實(shí)現(xiàn)隨機(jī)點(diǎn)名項(xiàng)目的實(shí)例代碼
這篇文章主要介紹了原生JS實(shí)現(xiàn)隨機(jī)點(diǎn)名項(xiàng)目的實(shí)例代碼,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-04-04
使用JSX實(shí)現(xiàn)Carousel輪播組件的方法(前端組件化)
做這個輪播圖的組件,我們先從一個最簡單的 DOM 操作入手。使用 DOM 操作把整個輪播圖的功能先實(shí)現(xiàn)出來,然后在一步一步去考慮怎么把它設(shè)計(jì)成一個組件系統(tǒng)2021-04-04
js腳本實(shí)現(xiàn)數(shù)據(jù)去重
最近在一個項(xiàng)目中,需要去除掉重復(fù)的數(shù)據(jù),之前都是在后臺實(shí)現(xiàn),現(xiàn)在客戶需求是在前臺去重,于是就想到了javascript腳本。2014-11-11
JavaScript實(shí)現(xiàn)數(shù)組隨機(jī)排序的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)數(shù)組隨機(jī)排序的方法,涉及javascript數(shù)組遍歷與排序的相關(guān)技巧,需要的朋友可以參考下2015-06-06

