使用者無法直接與 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 控制項時,此控制項的使用者介面會受阻,直到使用者將其啟用為止。 如果頁面使用上述元素載入多個控制項,則必須單獨啟用每個互動控制項。
如果某個控制項未啟用,就會出現下列結果。
| • |
會阻止與使用者互動相關的動態超文字標記語言 (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.jsdocument.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.jsembedControlLocation.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.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 檔案 --><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 檔案 --><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 函數或伺服器端指令碼確定某個控制項是否處於啟用狀態。 託管 網頁瀏覽器控制項的應用程式無法確定控制項是否處於啟用狀態。
控制項可以通過 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)SOFTWAREMicrosoft Internet 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 |
|
2007 Microsoft Corporation 著作權。著作權所有,並保留一切權利。使用規定。
返回頁首
轉載說明
作者:來自微軟MSDN相關文章
網址:本文引用自http://www.microsoft.com/china/MSDN/library/NetComm/activating_activex.mspx?mfr=true