如何从一个 HWND 获得 IHTMLDocument 2

原创 2008年09月28日 09:24:00

如何从一个 HWND 获得 IHTMLDocument 2

Retired KB Article本文介绍那些 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 的运行实例

.NET 获取任意一个WebBrowser中的HTMLDocument信息

首先必须找到索要获取的WebBrowser句柄 然后 using System; using System.Collections.Generic; using System.Text; usin...
  • a237428367
  • a237428367
  • 2012年11月29日 15:40
  • 2139

如何从Internet Explorer_Server窗口句柄获得IHTMLDocument

今天用到了,从网上搜了个方法,关键代码如下: #include #pragma comment(lib, "OleAcc.lib") //hWnd:Internet Explore...
  • crybird
  • crybird
  • 2011年08月02日 11:00
  • 2196

如何获得当前窗口的hwnd?的问题整理

如何获得当前窗口的hwnd?的问题整理 获取hwnd的方法有如下一些:    HWND GetActiveWindow(VOID); GetActiveWindow() GetTop...
  • thanklife
  • thanklife
  • 2016年10月26日 10:14
  • 3090

获取控制台窗口的句柄(hWnd)

转自:http://hi.baidu.com/console_app/blog/item/196387028b1893e409fa9330.html ——————— 【 转载请保留 】 ——————...
  • YL_WH
  • YL_WH
  • 2012年09月02日 13:41
  • 2406

如何查找窗体,获取窗体的句柄,Hwnd FindWindow函数

/*CWnd::FindWindow static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTRlpszWindowNa- me ...
  • jangdong
  • jangdong
  • 2013年09月29日 22:46
  • 3231

通过进程ID返回进程hWnd

typedef struct tagWNDINFO { DWORD dwProcessId; HWND hWnd; } WNDINFO, *LPWNDINFO; BOOL CALLBAC...
  • farcall
  • farcall
  • 2011年05月25日 21:53
  • 1284

由hwnd得到进程名 :GetProcessNameByHandle(HWND nlHandle)

wstring GetProcessNameByHandle(HWND nlHandle) { wstring loStrRet=L""; //得到该进程的进程id DWORD ldwProI...
  • liyun123gx
  • liyun123gx
  • 2014年05月08日 15:34
  • 1051

MFC_ HWND(获取控件或窗体句柄) [大三TJB_708]

平台:visual studio 2010   1 C++窗体对象和HWND 窗体对象是一个继承于CWnd类的C++类的 对象。咱们可以用构造函数生成一个windows窗体,此windows...
  • u010003835
  • u010003835
  • 2015年08月20日 09:43
  • 3102

[MFC] HWND(获取控件或窗体句柄) [大三TJB_708]

平台:visual studio 2010   1 C++窗体对象和HWND 窗体对象是一个继承于CWnd类的C++类的 对象。咱们可以用构造函数生成一个windows窗体,此windows窗体...
  • misskissC
  • misskissC
  • 2013年04月30日 18:02
  • 27391

HDC与HWND的关系

都知道,从HWND可以通过方法GetSafeHDC获得一个HDC句柄,用CDC::GetWindow方法可以获得一个CWnd指针。我就犯嘀咕了,dc和窗口两个类(对象)之间,究竟是怎么一种关系?他们是...
  • ds1130071727
  • ds1130071727
  • 2015年12月02日 19:43
  • 1125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何从一个 HWND 获得 IHTMLDocument 2
举报原因:
原因补充:

(最多只允许输入30个字)