本頁是否能提供幫助?
您對此內容的意見反應十分重要。 請告訴我們您的想法。
其他意見反應?
剩餘 1500 個字元
匯出 (0) 列印
全部展開

啟動 ActiveX 控制項

使用者不能直接與 APPLET EMBEDOBJECT 元素載入的 Microsoft ActiveX 控制項互動。使用者可與啟動其使用者介面後的控制項互動。本主題說明 Microsoft Internet Explorer 如何處理 ActiveX 控制項、顯示如何載入 ActiveX 控制項以啟動其介面,並說明此行為對於協助工具和裝載 WebBrowser 控制項之應用程式的影響。

本主題包含下列小節。

瞭解控制項啟動

互動式控制項是提供使用者介面的 ActiveX 控制項。當網頁使用 APPLETEMBEDOBJECT 元素來載入 ActiveX 控制項時,會封鎖控制項使用者介面,直到使用者啟動它為止。如果某個頁面使用這些元素來載入多個控制項時,就必須個別啟動每個互動式控制項。

當控制項為非使用中時,會造成下列影響。

  • 會封鎖與使用者互動相關的動態 HTML (DHTML) 事件,例如 onblur 與 onclick。「附錄 A」列出控制項為非使用中時的 DHTML 事件。

  • 控制項不會回應鍵盤或滑鼠產生的視窗訊息,例如 WM_CLICK 與 WM_KEYPRESS 等等。

  • 在控制項的 OLE 網站上建立的重疊視窗可防止鍵盤與滑鼠訊息取得非使用中控制項。

建立非使用中控制項時,Internet Explorer 會使用不同的技術以防止鍵盤或滑鼠視窗訊息取得該控制項。當非使用中控制項為視窗控制項 (例如,HTML 說明控制項) 時,Internet Explorer 會使用 EnableWindow 函數來停用非使用中控制項的視窗。當使用者啟動視窗控制項時,相同的函數會啟動停用的視窗。當非使用中的控制項是無視窗的控制項 (例如 Office Web 元件) 時,控制項容器會篩選鍵盤和滑鼠訊息。

當控制項為非使用中時,它不會對使用者輸入回應,不過,它會執行沒有牽涉互動的作業。例如,如果您開啟使用 Microsoft Windows Media Player 來播放音樂檔的網頁,在網頁載入後就會播放音樂。您必須啟動控制項的使用者介面,才能與 Windows Media Player 互動,如下圖所示。

ms537508.activating_activex_fig01(zh-tw,VS.85).gif

注意  雖然非使用中控制項不會回應直接的使用者互動;不過它們會回應指令碼命令。

若要啟動非使用中控制項,請按一下它或使用 TAB 鍵在它上面設定焦點,然後按空白鍵或 ENTER 鍵。從外部指令碼檔案載入的非使用中控制項會立即回應使用者的互動,而且不需要啟動它們。

有些視窗控制項會使用 Windows API 函數 (例如 GetKeyState 與 GetCursorPos),以決定鍵盤與滑鼠的狀態,然後回應函數結果。就只有這些控制項,會先顯示提示,然後才在 Internet Explorer 中執行控制項。若要執行控制項,使用者需要按一下訊息視窗中的按鈕,才會載入頁面。在載入後,控制項將不需要啟動。目前,下列控制項會有此行為,但是廠商所使用的新控制項將不會有此行為。

  • Virtools SA 的 Virtools™ Web Player
  • Adobe Systems 公司的 Macromedia Shockwave Player™
  • Apple Computer 公司的 QuickTime™

從外部指令碼檔案載入時,這些控制項不會顯示提示。

下圖顯示提示對話方塊。

ms537508.activating_activex_fig02(zh-tw,VS.85).gif

從外部載入互動式控制項

若要建立可載入互動式控制項以立即回應使用者輸入的網頁,請使用 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 將 Object 或 Embed 元素加入網頁時,請小心使用它以建立元素、初始化其屬性並將它加入網頁的 DOM,再建立可由新元素載入的 ActiveX 控制項。如需詳細資訊,請參閱 createElement 文件。
	// HTML File
<html>
  <body> 
    <div id="DivID">
      <script src="createElementExplicit.js"></script>
  </body>
</html>
  
	// 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 Explorer),使用這些技術建立的控制項仍然需要啟動。

以程式方式判斷控制台是否為使用中

您無法使用 JScript 函數或伺服器端伺令碼來判斷控制台是否為使用中。裝載網頁瀏覽器控制項的應用程式無法判斷控制項是否為使用中。 控制項可以透過 DISPID_AMBIENT_UIDEAD 環境屬性來呼叫 IDispatch::Invoke,以判斷啟動狀態。當此屬性透過 IOleControl 來變更時,會通知實作 IOleControl::OnAmbientPropertyChange介面的控制項。

協助工具的影響

當協助工具遇到 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 and S_OK
IAccessible::get_accDefaultAction 傳回 "Select this control"
IAccessible::get_accDescription 傳回 E_NOTIMPL
IAccessible::get_accFocus 傳回 E_NOTIMPL
IAccessible::get_accHelp 傳回「此控制項為非使用中。選取要啟動的控制項並使用它。
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 的自訂應用程式不會封鎖 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 產品支援。

附錄 A:互動式控制項封鎖的 DHTML 事件

下表列出 ActiveX 控制項為非使用中時所封鎖的 DTHML 事件。
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 ?/td>
ondragenter onmousemove ?/td>

社群新增項目

顯示:
© 2015 Microsoft