【轉】激活 ActiveX 控件

用戶無法直接與 APPLETEMBEDOBJECT 元素加載的 Microsoft ActiveX 控件交互。 用戶激活這些控件的用戶界面後纔可以與這些控件交互。 本主題介紹了 Microsoft Internet Explorer 如何處理 ActiveX 控件,顯示如何加載 ActiveX 控件才能激活它們的界面,並且說明了此行爲對輔助工具以及託管 WebBrowser 控件的應用程序的影響。(本文章還包含指向英文網頁的鏈接。)

*

此主題包含以下部分。

本頁內容
瞭解控件激活 瞭解控件激活
外部加載交互控件 外部加載交互控件
以編程的方式確定控件是否未激活 以編程的方式確定控件是否未激活
協助影響 協助影響
WebBrowser 控件影響 WebBrowser 控件影響
附錄 A: 未激活控件阻止的 DHTML 事件 附錄 A: 未激活控件阻止的 DHTML 事件

有關用戶體驗的介紹,請參閱 Internet Explorer 6: ActiveX 更新

有關該更新所影響平臺的其他信息,請參閱 Internet Explorer ActiveX 更新

瞭解控件激活

交互控件是提供用戶界面的 ActiveX 控件。 當網頁使用 APPLET、EMBED 或 OBJECT 元素加載某個 ActiveX 控件時,此控件的用戶界面會受阻,直到用戶將其激活爲止。 如果頁面使用上述元素加載多個控件,則必須單獨激活每個交互控件。

如果某個控件未激活,就會出現下列結果。

會阻止與用戶交互相關的動態 HTML (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.js
document.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.js
embedControlLocation.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.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 文件 -->
<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 文件 --><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 函數或服務器端腳本確定某個控件是否處於激活狀態。 託管 Web 瀏覽器控件的應用程序無法確定控件是否處於激活狀態。

控件可以通過 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)
SOFTWARE
Microsoft Internet Explorer
Main
FeatureControl
FEATURE_ENABLE_ACTIVEX_INACTIVATE_MODE
process_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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章