控件可以通过 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 Control 的自定义应用程序不会阻止由 APPLET、EMBED 或 OBJECT 元素加载的交互式 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)SOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_ENABLE_ACTIVEX_INACTIVATE_MODEprocess_name.exe=(DWORD) 0x00000001
注 因为用户可以修改注册表,所以 DOCHOSTUIINFO 标志是启用交互控件阻止的首选方法。
默认情况下,应用程序可以注册以并入 ActiveX 控件激活。有关详细信息,请