Jak získat IHTMLDocument2 z HWND

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Souhrn

Tento článek ukazuje, jak získat rozhraní IHTMLDocument2 z HWND. Pokud je nainstalován Microsoft Active Accessibility (MSAA), můžete odeslat zprávu WM_HTML_GETOBJECT okna dokumentu (s třídy okna "Internet Explorer_Server") a pak předat výsledek z SendMessage funkce MSAA, ObjectFromLresultzískat plně zařazené ukazatel IHTMLDocument2.

Další informace

Musíte mít nainstalované v systému pro daný kód popsaný v této části práce součásti Active Accessibility. Klient mohou vývojáři SDK vytvářet a aktualizovat aktivní usnadnění. Je-li zahrnout nejnovější verze sady Active Accessibility a distribuovat nové verze aplikace pomůcek pro usnadnění, je nutné distribuovat součásti runtime (RDK) pro klienty, které byly vyvinuty pro systémy Microsoft Windows 95, Windows 98 nebo Windows NT 4.0 Service Pack 4 nebo 5. Není nutné zahrnout RDK pro klienty vyvinutý výhradně pro systém Windows 2000 nebo Windows NT 4.0 s aktualizací Service Pack 6. Nové součásti jsou již zahrnuty v těchto operačních systémech.


Naleznete v části "Odkazy" tohoto článku informace o Active Accessibility a kde lze stáhnout Active Accessibility SDK.

#include <mshtml.h>#include <atlbase.h>
#include <oleacc.h>

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHARbuf[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();
}

POZNÁMKA: Internet Explorer 5.5 snímky byly implementovány hostí novou instanci Shdocvw.dll do každého snímku má samostatné okno s ním spojené. Internet Explorer 5.5 implementuje nativních rámců pro lepší výkon a všechny snímky jsou vykresleny ve stejné instanci Shdocvw.dll. Vzhledem k tomu, že nebude HWND pro každý rámec pro aplikaci Internet Explorer 5.5 a novější, ukázkový kód popsaný v této části bude fungovat jak se dostat do hlavního okna dokumentu. Každý snímek dokumentu můžete stále získat pomocí kolekce snímků z hlavního dokumentu.

Odkazy

SDK pro vývojáře a RDK, který nainstaluje součásti Active Accessibility runtime do operačního systému, lze stáhnout z následujícího webu společnosti Microsoft:

Informace o podpoře společnosti Microsoft Active Accessibility poskytované MSHTML součást aplikace Microsoft Internet Explorer naleznete na následujícím webu:
Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

176792 jak se připojit k instanci spuštěné aplikace Internet Explorer

Vlastnosti

ID článku: 249232 - Poslední kontrola: 10. 1. 2017 - Revize: 1

Váš názor