啟用 ActiveX 控制項發布日期: 2006-3-29 | 更新日期: 2006-3-29
Internet 開發索引
使用者不能與 APPLET、EMBED 或 OBJECT 元素載入的 Microsoft ActiveX 控制項直接互動。使用者啟用這些控制項的使用者介面後才可以與這些控制項互動。本文介紹 Microsoft Internet Explorer 如何處理 ActiveX 控制項,顯示如何載入 ActiveX 控制項才能啟用它們的介面,還描述這種行為對協助工具輔助和宿主 WebBrowser 控制項的應用程式的影響。
本主題包含以下部分。
本頁內容
|
瞭解控制項啟用 |
|
外部載入互動控制項 |
|
以編程方式確定控制項是否未啟用 |
|
輔助影響 |
|
WebBrowser 控制項影響 |
|
附錄 A:未啟用控制項所阻止的 DHTML 事件 |
有關該更新所影響平台的其他資訊,請參見Internet Explorer ActiveX 更新。
瞭解控制項啟用
互動控制項 是提供使用者介面的 ActiveX 控制項。當 Web 頁使用 APPLET、EMBED 或 OBJECT 元素載入某個 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 媒體播放器互動,如所示。
注 雖然未啟用控制項不響應任何直接的使用者互動;但它們響應指令碼命令。
要啟用一個互動控制項,可以單擊該控制項,也可以使用 Tab 鍵將焦點設定在該控制項上,然後按 SPACEBAR 或 ENTER 鍵。從外部指令碼載入的互動控制項無需啟用即可立即響應使用者互動。
某些有視窗的控制項使用 Windows API 函數(如 GetKeyState 和 GetCursorPos)確定鍵盤和滑鼠的狀態,然後響應函數結果。僅對於這些控制項而言,先出現一個提示,然後才會在 Internet Explorer 中運行控制項。要運行控制項,使用者需要先單擊訊息視窗中的按鈕,然後頁面才會載入。載入後,控制項不需要啟用。目前,以下控制項具有該行為,但供應商正在繼續研發沒有該行為的新控制項。
| • |
VirtoolsWeb Player from Virtools SA |
| • |
Macromedia Shockwave Playerfrom Adobe Systems Inc. |
| • |
QuickTimefrom Apple Computer, Inc. |
從外部指令檔載入時,這些控制項不顯示提示。
顯示提示對話方塊。
返回頁首
外部載入互動控制項
要建立載入互動控制項(這些控制項立即響應使用者輸入)的 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.jsdocument.write(' <embed src="examplecontrol">')
外部指令檔也可以修改某個元素的 outerHTML 屬性來達到同樣的效果,如下例所示。
// HTML File<html> <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 File<html> <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 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.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 File<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>');
警告 如果在控制台的“Internet 選項”的“進階”選項卡中不選“禁用指令碼調試 (Internet Explorer)”選項,則使用這些技術建立的控制項仍需啟用。
返回頁首
以編程方式確定控制項是否未啟用
您不能使用 JScript 函數或伺服器端指令碼來確定某個控制項是否為啟用。宿主 網頁瀏覽器控制項的應用程式不能確定某個控制項是否為啟用。
控制項可以通過 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 的自訂應用程式不會阻止由 APPLET、EMBED 或 OBJECT 元素載入的互動式 ActiveX 控制項。未啟用控制項阻止僅應用於以下應用程式。
| • |
Windows Explorer |
| • |
Internet Explorer |
| • |
MSN Explorer |
| • |
AOLExplorer |
| • |
AOL8.0 |
| • |
AOL9.0 |
| • |
CompuServe 2000 |
| • |
AIM |
| • |
Maxthon Browser |
| • |
NetCaptor |
| • |
Browse3D |
| • |
Macromedia Dreamweaver |
| • |
Macromedia Contribute |
| • |
Netscape8(將 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 |
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 |
- |