如何从 HWND 获取 IHTMLDocument2

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 249232
本文已归档。它按“原样”提供,并且不再更新。
概要
本文介绍如何从 HWND 的 IHTMLDocument2 接口。如果安装了 Microsoft 活动辅助功能 (MSAA),可以将 WM_HTML_GETOBJECT 消息发送到文档的窗口 (与窗口的类"互联网 Explorer_Server"),然后将从发送的结果传递给 MSAA 函数中, ObjectFromLresult,以获得完全的已封送的 IHTMLDocument2 指针。
更多信息
您必须具有活动辅助功能来处理该节中所述的代码的系统上安装的组件。客户端开发人员可以使用 SDK 来开发和更新活动辅助功能的帮助。如果您合并活动辅助功能的最新版本和分发您的辅助功能的新版本,则必须对已开发的 Microsoft Windows 95、 Windows 98 中或与 Service Pack 4 或 5 的 Windows NT 4.0 的客户端分发运行时组件 (RDK)。没有必要包括适用于客户端开发的专用于 Windows 2000 或 Windows NT 4.0 服务包 6 RDK。这些操作系统的系统中已包含了新的组件。

请参阅有关活动辅助功能以及在哪里可以下载活动的可访问性 SDK 信息本文的"参考"部分。
#include <mshtml.h>#include <atlbase.h>#include <oleacc.h>BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam){	TCHAR	buf[100];	::GetClassName( hwnd, (LPTSTR)&buf, 100 );	if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )	{		*(HWND*)lParam = hwnd;		return FALSE;	}	else		return TRUE;};//You can store the interface pointer in a member variable //for easier accessvoid CDlg::OnGetDocInterface(HWND hWnd) {	CoInitialize( NULL );	// Explicitly load MSAA so we know if it's installed	HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );	if ( hInst != NULL )	{		if ( hWnd != NULL )		{			HWND hWndChild=NULL;			// Get 1st document window			::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );			if ( hWndChild )			{				CComPtr<IHTMLDocument2> spDoc;				LRESULT lRes;							UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );				::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );				LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );				if ( pfObjectFromLresult != NULL )				{					HRESULT hr;					hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );					if ( SUCCEEDED(hr) )					{						// Change background color to red						spDoc->put_bgColor( CComVariant("red") );					}				}			} // else document not ready		} // else Internet Explorer is not running		::FreeLibrary( hInst );	} // else Active Accessibility is not installed	CoUninitialize();}				
注:Internet Explorer 5.5 中,框架通过承载的 Shdocvw.dll,新实例实现前后每个框架有一个单独的窗口,与之相关联。Internet Explorer 5.5 实现本机框架,为了提高性能,并且所有帧都呈现 Shdocvw.dll 的同一个实例。因为不会为 Internet Explorer 5.5 及更高版本的每个帧的 HWND,本节中介绍的代码示例将努力获取的主窗口的文档。仍然可以使用主文档的框架集合的每个框架的文档。
参考
为开发人员提供的 SDK 和 RDK,从而安装到系统上的活动辅助功能运行时组件,可以下载从下列 Microsoft Web 站点:有关 Microsoft Internet Explorer 的 MSHTML 组件提供的 Microsoft 活动辅助功能支持的信息,请访问下面的网站:有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
176792如何连接到 Internet Explorer 的正在运行的实例
活动辅助功能文档对象模型 hwnd

属性

文章 ID:249232 - 上次审阅时间:12/05/2015 18:00:54 - 修订版本: 4.0

Microsoft Internet Explorer 4.01 Service Pack 1

  • kbnosurvey kbarchive kbhowto kbmshtml kbwebbrowser kbmt KB249232 KbMtzh
反馈