Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト|サインイン
MSDN*
マイクロソフト サイトの検索:
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ
MSDN Home > Web Workshop > ActiveX コントロールのアクティブ化

ActiveX コントロールのアクティブ化

日本語版最終更新日 2006 年 3 月 16 日

ユーザーは、APPLET (英語)、EMBED (英語)、または OBJECT (英語) 要素によって読み込まれた Microsoft ActiveX コントロールとは直接対話できません。これらのコントロールと対話するには、ユーザー インターフェイスをアクティブ化する必要があります。このトピックでは、Microsoft Internet Explorer による ActiveX コントロールの処理方法、ActiveX コントロールを読み込んでインターフェイスをアクティブ化する方法、およびこの動作がユーザー補助ツールや WebBrowser コントロール (英語) をホストしているアプリケーションに与える影響について説明します。

このトピックのセクションは次のとおりです。

この更新プログラムによって影響を受けるプラットフォームの詳細については、「Internet Explorer の ActiveX 更新プログラム」を参照してください。

コントロールのアクティブ化の理解

対話型コントロール とは、ユーザー インターフェイスを提供する ActiveX コントロールのことです。Web ページで ActiveX コントロールの読み込みに APPLETEMBED、または OBJECT 要素が使用される場合、コントロールのユーザー インターフェイスはユーザーがアクティブ化するまでブロックされています。ページでこれらの要素を使用して複数のコントロールが読み込まれる場合、各対話型コントロールを個別にアクティブ化する必要があります。

コントロールが非アクティブの場合、次のような影響があります。

  • onblur、obclick など、ユーザー操作に関連する動的 HTML (DHTML) イベント (英語) がブロックされます。付録 A には、コントロールが非アクティブの場合にブロックされる DHTML イベントが示されています。

  • コントロールは、WM_CLICK、WM__KEYPRESS など、キーボードまたはマウスによって生成されるウィンドウ メッセージに応答しません。

  • コントロールの OLE サイトで作成されたオーバーレイ ウィンドウにより、キーボードまたはマウスのメッセージは、非アクティブなコントロールに到達できません。

非アクティブなコントロールが作成されると、Internet Explorer ではさまざまな方法を使用して、キーボードまたはマウスのウィンドウ メッセージがコントロールに到達しないようにします。非アクティブなコントロールが、HTML ヘルプ コントロールなどのウィンドウ表示のコントロールの場合、Internet Explorer では EnableWindow 関数 (英語) を使用して、非アクティブなコントロールのウィンドウが無効にされます。ユーザーがウィンドウ表示のコントロールをアクティブ化すると、無効にされたウィンドウが同じ関数によってアクティブ化されます。非アクティブなコントロールが、Office Web コンポーネントなどのウィンドウのないコントロールの場合、キーボードおよびマウスのメッセージはコントロールのコンテナによってフィルタ処理されます。

コントロールが非アクティブの場合、ユーザーの入力には応答しません。ただし、対話を伴わない操作は実行されます。たとえば、音楽ファイルの再生に Microsoft Windows Media Player を使用する Web ページを開いた場合、ページが読み込まれた後に音楽が再生されます。次の図に示すように、コントロールのユーザー インターフェイスがアクティブ化されるまで、ユーザーは Windows Media Player を操作できません。

APPLET、EMBED、または OBJECT 要素によって読み込まれた非アクティブなコントロールは、使用する前にアクティブ化する必要があります。

注意  非アクティブなコントロールは、ユーザーの直接操作には応答しませんが、スクリプト コマンドには応答します。

非アクティブなコントロールをアクティブ化するには、コントロールをクリックするか、Tab キーを使用してコントロールにフォーカスを移し、Space キーまたは Enter キーを押します。外部スクリプト ファイルから読み込まれた非アクティブなコントロールは、ユーザー操作にすぐに応答するため、アクティブ化する必要はありません。

一部のウィンドウ表示のコントロールでは、GetKeyState、GetCursorPos などの Windows API 関数を使用してキーボードおよびマウスの状態を特定し、関数の結果に応答します。これらのコントロールの場合にのみ、Internet Explorer で実行される前にプロンプトが表示されます。コントロールを実行するには、ページが読み込まれる前にメッセージ ウィンドウのボタンをクリックする必要があります。ページが読み込まれたら、コントロールをアクティブ化する必要はありません。現時点では次のコントロールでこの動作が行われますが、ベンダはこの動作が発生しない新しいコントロールの開発に取り組んでいます。

  • Virtools SA の Virtools WebPlayer
  • Adobe Systems Inc. の Macromedia Shockwave Player
  • Apple Computer, Inc. の QuickTime

外部スクリプト ファイルからの読み込みが行われた場合、これらのコントロールでプロンプトは表示されません。

次の図は、プロンプトのダイアログ ボックスを示しています。

ユーザーとの対話に Windows API 関数を使用するウィンドウ表示の ActiveX コントロールは、アクティブ化のプロンプトが表示された後に読み込まれます。

外部からの対話型コントロールの読み込み

ユーザー入力にすぐに応答する非アクティブなコントロールを読み込む Web ページを作成するには、Microsoft JScript を使用して、外部スクリプト ファイルからコントロールを読み込みます。メインの HTML ページにスクリプト要素をインラインに記述してコントロールを外部から読み込むことはできません。スクリプトが、たとえば writeln 関数 (英語) を使用して、プログラムによってインラインで記述されている場合、読み込まれたコントロールは HTML ドキュメント自体によって読み込まれたように動作するため、アクティブ化する必要はありません。コントロールが対話できる状態で読み込まれるようにするには、次のいずれかの方法を使用します。

次の例では、document.write (英語) を使用してコントロールを動的に読み込みます。

// HTML ファイル
<html>
  <body leftmargin=0 topmargin=0 scroll=no>
    <script src="Embed.js"></script>
  </body>
</html>
// embed.js
document.write('<embed src="examplecontrol">')

次の例で示すように、外部スクリプト ファイルで要素の outerHTML プロパティ (英語) を変更しても、同じ結果を得られます。

// HTML ファイル
<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 要素を Web ページに追加する場合、要素の作成およびその属性の初期化は注意して行い、新しい要素によって読み込まれる ActiveX コントロールを作成する前に、要素をページの DOM に追加してください。詳細については、createElement (英語) のドキュメントを参照してください。
// HTML ファイル
<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 ファイル
<html>
 <head>
   <script src="external_script.js" language="JScript"></script>
 </head>
 
 <body>
   <div id="EXAMPLE_DIV_ID">
      このテキストはコントロールによって置き換えられます。
   </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.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 またはサーバー側のスクリプトを使用してコントロールがアクティブかどうかを確認することはできません。また、Web ブラウザ コントロールをホストしているアプリケーションによってコントロールがアクティブかどうかを確認することはできません。

コントロールでは、IDispatch::Invoke (英語) を使用して DISPID_AMBIENT_UIDEAD アンビエント プロパティを呼び出すことで、アクティブ化の状態を確認できます。IOleControl インターフェイス (英語) を実装するコントロールは、このプロパティが IOleControl::OnAmbientPropertyChange (英語) を使用して変更された時点で通知を受け取ります。

ユーザー補助に対する影響

ユーザー補助ツールで ActiveX コントロールが検出された場合、オブジェクトの IAccessible インターフェイス (英語) を使用して、コントロールに関する情報を取得できます。非アクティブなコントロールは、IAccessible::accDoDefaultAction メソッド (英語) を使用してアクティブ化できます。

次の表は、非アクティブなコントロールに対して IAccessible メソッドが呼び出された場合の結果を示しています。

メソッド説明
IAccessible::accDoDefaultActionコントロールをアクティブ化し、ActiveX コントロールまたは Java Applet を MSAA ツリー内に表示します。
IAccessible::accHitTestCHILDID_SELF を返します。
IAccessible::accLocationもとになる ActiveX コントロールまたは Java Applet の場所です。
IAccessible::accNavigateE_NOTIMPL を返します。
IAccessible::accSelectE_NOTIMPL を返します。
IAccessible::get_accChildS_FALSE を返します。
IAccessible::get_accChildCount0 および S_OK を返します。
IAccessible::get_accDefaultAction"このコントロールを選択してください" を返します。
IAccessible::get_accDescriptionE_NOTIMPL を返します。
IAccessible::get_accFocusE_NOTIMPL を返します。
IAccessible::get_accHelp"このコントロールは非アクティブです。アクティブ化して使用するにはコントロールを選択してください。" を返します。
IAccessible::get_accHelpTopic変更なし - E_NOTIMPL を返します。
IAccessible::get_accKeyboardShortcut変更なし - オブジェクトを委任します。オブジェクトがない場合、メソッドは E_NOTIMPL を返します。
IAccessible::get_accName"非アクティブなコントロールです" を返します。
IAccessible::get_accParent変更なし - 親チェーン内の、最も近いアクセス可能な要素を返します。
IAccessible::get_accRoleROLE_SYSTEM_PUSHBUTTON を返します。
IAccessible::get_accSelectionE_NOTIMPL を返します。
IAccessible::get_accStateオブジェクトの現在の状態を返します。この状態には、常に STATE_SYSTEM_FOCUSABLE が含まれます。
IAccessible::get_accValueE_NOTIMPL を返します。
IAccessible::put_accNameE_NOTIMPL を返します。
IAccessible::put_accValueE_NOTIMPL を返します。

アクティブ化されたコントロール、またはアクティブ化が不要なコントロールについては、Active Accessibility SDK (英語) を参照してください。

注意  ユーザー補助ツールは、ActiveX コントロールおよびその子 (ある場合) のデータを正しく表示するために、既定の操作をトリガした後に更新する必要があります。

WebBrowser コントロールに対する影響

既定では、WebBrowser コントロールをホストしているカスタム アプリケーションでは、APPLETEMBED、または OBJECT 要素によって読み込まれた対話型 ActiveX コントロールはブロックされません。非アクティブなコントロールのブロックは、次のアプリケーションにのみ適用されます。

  • Windows エクスプローラ
  • 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 の動作を一致させるには、次の例に示すように、DOCHOSTUIINFO 構造体 (英語) の dwFlags パラメータに DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE フラグを追加します。

HRESULT GetHostInfo(DOCHOSTUIINFO *pInfo)
{
   ...

    pInfo->cbSize = sizeof(DOCHOSTUIINFO);
    pInfo->dwFlags = { Other DOCHOSTUIFLAGs } | 
      DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE;  
   ...

    return S_OK;
}

また、アプリケーションのプロセス名を次のレジストリ キーに追加することで、非アクティブなコントロールのブロックを有効にすることもできます。

HKEY_LOCAL_MACHINE (または 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 イベントを示しています。

onactivateondragleaveonmouseout
onbeforeactivateondragoveronmouseover
onbeforecopyondragstartonmouseup
onbeforecutondroponmousewheel
onbeforedeactivateonfocusonmove
onbeforepasteonfocusinonmoveend
onbluronfocusoutonmovestart
onclickonhelponpage
oncontextmenuonkeydownonpaste
oncontrolselectonkeypressonresize
oncopyonkeyuponresizeend
oncutonlosecaptureonresizestart
ondblclickonmousedownonscroll
ondeactivateonmouseenteronselectstart
ondragendonmouseleave
ondragenteronmousemove


Microsoft