如何从一个 HWND 获得 IHTMLDocument 2

如何从一个 HWND 获得 IHTMLDocument 2

本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。
文章编号 : 249232
最后修改 : 2006年9月27日
修订 : 3.0

概要

本文演示如何从一个 HWND 获取 IHTMLDocument 2 接口。 如果安装了 Microsoft Active Accessibility (MSAA),可以 WM_HTML_GETOBJECT 消息发送到此文档窗口 (与窗口类"Internet Explorer_Server"),然后将结果从 SendMessage 消息传递到一个 MSAA 函数, ObjectFromLresult ,获取一个完全封送处理 IHTMLDocument 2 指针。

回到顶端

更多信息

您必须要本节所述代码在系统上安装 Active Accessibility 组件。 客户端开发人员可以使用 SDK 来开发和更新活动辅助功能帮助。 if incorporate latest version of Active Accessibility and distribute new versions of your accessibility aids,must distribute runtime components (RDK) for clients that have been developed for Microsoft Windows 95,Windows 98,or Windows NT 4.0 with Service Pack 4 or 5。 不是的需要包括 RDK 用于开发或仅用于 Windows 2000,有 Service Pack 6 的 Windows NT 4.0 的客户端。 新的组件已经包含在这些操作系统中。

请参见有关活动辅助功能和要下载 Active Accessibility 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 access
void 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 for developers and RDK,which installs onto operating system,Active Accessibility runtime components can be downloaded from following Microsoft Web site:
http://www.microsoft.com/downloads/details.aspx?FamilyID=9b14f6e1-888a-4f1d-b1a1-da08ee4077df&DisplayLang=en (http://www.microsoft.com/downloads/details.aspx?FamilyID=9b14f6e1-888a-4f1d-b1a1-da08ee4077df&DisplayLang=en)
有关 Microsoft Active Accessibility 支持由 Microsoft Internet Explorer 的 MSHTML 组件提供的信息,请访问下面的 Web 站点:
http://msdn.microsoft.com/workshop/browser/accessibility/overview/overview.asp (http://msdn.microsoft.com/workshop/browser/accessibility/overview/overview.asp)
有关详细信息,单击下面的文章编号以查看 Microsoft 知识库中相应的文章:
176792 (http://support.microsoft.com/kb/176792/) 如何连接到 Internet Explorer 的运行实例

你可能感兴趣的:(如何从一个 HWND 获得 IHTMLDocument 2)