激活 ActiveX 控件
激活 ActiveX 控件
用戶不能與 APPLET、EMBED 或 OBJECT 元素加載的 Microsoft ActiveX 控件直接交互。用戶激活這些控件的用戶界面后才可以與這些控件交互。本文介紹 Microsoft Internet Explorer 如何處理 ActiveX 控件,顯示如何加載 ActiveX 控件才能激活它們的界面,還描述這種行為對輔助工具和宿主 WebBrowser 控件的應用程序的影響。
本主題包含以下部分。

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

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

外部加載交互控件
要創(chuàng)建加載交互控件(這些控件立即響應用戶輸入)的 Web 頁,使用 Microsoft JScript 從外部腳本文件加載控件。您不能編寫與主 HTML 頁內(nèi)聯(lián)的腳本元素來從外部加載控件。如果腳本是以編程方式內(nèi)聯(lián)編寫的(例如,用 writeln 函數(shù)),加載的控件就像由 HTML 文檔本身加載的一樣,需要激活。要確??丶诩虞d后是交互的,使用以下任一技術。
下面的示例使用 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 屬性來達到同樣的效果,如下例所示。
// 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 元素時,請小心創(chuàng)建該元素,初始化其屬性,將該元素添加到頁面的 DOM,然后再創(chuàng)建要由該新元素加載的 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 函數(shù)加載 ActiveX 控件,同時指定參數(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 選項”的“高級”選項卡中不選“禁用腳本調試 (Internet Explorer)”選項,則使用這些技術創(chuàng)建的控件仍需激活。
以編程方式確定控件是否未激活
您不能使用 JScript 函數(shù)或服務器端腳本來確定某個控件是否為激活。宿主 Web 瀏覽器控件的應用程序不能確定某個控件是否為激活。
控件可以通過 DISPID_AMBIENT_UIDEAD 環(huán)境屬性確定激活狀態(tài),該屬性通過 IDispatch::Invoke 調用。該屬性通過 IOleControl::OnAmbientPropertyChange 進行更改時,會通知實現(xiàn) IOleControl 接口的控件。
輔助影響
當輔助工具遇到 ActiveX 控件時,可以使用對象的 IAccessible 接口獲取有關該控件的信息。可以用 IAccessible::accDoDefaultAction 方法激活未激活的控件。
下表描述在未激活控件上調用 IAccessible 方法產(chǎn)生的結果。
方法 | 說明 |
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 |
返回對象的當前狀態(tài)。該狀態(tài)總是包括 STATE_SYSTEM_FOCUSABLE |
IAccessible::get_accValue |
返回 E_NOTIMPL |
IAccessible::put_accName |
返回 E_NOTIMPL |
IAccessible::put_accValue |
返回 E_NOTIMPL |
有關激活的控件或不需要激活的控件的信息,請參閱 Active Accessibility SDK。
注 輔助工具觸發(fā)默認操作后應該刷新,這樣才能正確顯示 ActiveX 控件的數(shù)據(jù)及其子控件的數(shù)據(jù)(如果有)。
WebBrowser 控件影響
默認情況下,宿主 WebBrowser Control 的自定義應用程序不會阻止由 APPLET、EMBED 或 OBJECT 元素加載的交互式 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 用作呈現(xiàn)引擎時) |
要與應用程序中 Internet Explorer 的行為匹配,將 DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 標志添加到 DOCHOSTUIINFO 結構的 dwFlags 參數(shù)中,如下例所示。
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 控件激活。有關詳細信息,請咨詢您的技術客戶經(jīng)理或與 Microsoft 的產(chǎn)品支持部門聯(lián)系。
附錄 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設計模式之原型模式(Object.create與prototype)介紹
這篇文章主要介紹了JavaScript設計模式之原型模式(Object.create與prototype)介紹,原型模式指使用原型實例來拷貝、創(chuàng)建新的可定制的對象,新建的對象,不需要知道原對象創(chuàng)建的具體過程,需要的朋友可以參考下2014-12-12uni.getLocation和wx.getLocation方法調用無效也不返回失敗的解決方案
這篇文章主要給大家介紹了關于uni.getLocation和wx.getLocation方法調用無效也不返回失敗的解決方案,文中通過實例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-04-04如何在JavaScript中創(chuàng)建具有多個空格的字符串?
這篇文章主要介紹了如何在JavaScript中創(chuàng)建具有多個空格的字符串?,需要的朋友可以參考下2020-02-02JavaScript監(jiān)聽和禁用瀏覽器回車事件實例
這篇文章主要介紹了JavaScript監(jiān)聽和禁用瀏覽器回車事件實例,本文直接給出示例代碼,需要的朋友可以參考下2015-01-01