Microsoft KB Archive/249232: Difference between revisions

From BetaArchive Wiki
m (Text replacement - ">" to ">")
m (Text replacement - """ to """)
 
(One intermediate revision by the same user not shown)
Line 49: Line 49:
== SUMMARY ==
== SUMMARY ==


This article shows how to get the IHTMLDocument2 interface from a HWND. If Microsoft Active Accessibility (MSAA) is installed, you can send the WM_HTML_GETOBJECT message to the document's window (with the window class "Internet Explorer_Server") and then pass the result from SendMessage to an MSAA function, '''ObjectFromLresult''', to get a fully marshaled IHTMLDocument2 pointer.
This article shows how to get the IHTMLDocument2 interface from a HWND. If Microsoft Active Accessibility (MSAA) is installed, you can send the WM_HTML_GETOBJECT message to the document's window (with the window class "Internet Explorer_Server") and then pass the result from SendMessage to an MSAA function, '''ObjectFromLresult''', to get a fully marshaled IHTMLDocument2 pointer.


</div>
</div>
Line 58: Line 58:
You must have Active Accessibility components installed on the system for the code described in this section to work. Client developers can use the SDK to develop and update Active Accessibility aids. If you incorporate the latest version of Active Accessibility and distribute new versions of your accessibility aids, you must distribute the 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. It's not necessary to include the RDK for clients developed solely for Windows 2000, or for Windows NT 4.0 with Service Pack 6. The new components are already included in these operating systems.<br />
You must have Active Accessibility components installed on the system for the code described in this section to work. Client developers can use the SDK to develop and update Active Accessibility aids. If you incorporate the latest version of Active Accessibility and distribute new versions of your accessibility aids, you must distribute the 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. It's not necessary to include the RDK for clients developed solely for Windows 2000, or for Windows NT 4.0 with Service Pack 6. The new components are already included in these operating systems.<br />
<br />
<br />
See the &quot;References&quot; section of this article for information about Active Accessibility and where to download the Active Accessibility SDK.
See the "References" section of this article for information about Active Accessibility and where to download the Active Accessibility SDK.
<pre class="codesample">#include <mshtml.h>
<pre class="codesample">#include <mshtml.h>
#include <atlbase.h>
#include <atlbase.h>
Line 67: Line 67:
     TCHAR  buf[100];
     TCHAR  buf[100];


     ::GetClassName( hwnd, (LPTSTR)&amp;buf, 100 );
     ::GetClassName( hwnd, (LPTSTR)&buf, 100 );
     if ( _tcscmp( buf, _T(&quot;Internet Explorer_Server&quot;) ) == 0 )
     if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
     {
     {
         *(HWND*)lParam = hwnd;
         *(HWND*)lParam = hwnd;
Line 84: Line 84:


     // Explicitly load MSAA so we know if it's installed
     // Explicitly load MSAA so we know if it's installed
     HINSTANCE hInst = ::LoadLibrary( _T(&quot;OLEACC.DLL&quot;) );
     HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
     if ( hInst != NULL )
     if ( hInst != NULL )
     {
     {
Line 91: Line 91:
             HWND hWndChild=NULL;
             HWND hWndChild=NULL;
             // Get 1st document window
             // Get 1st document window
             ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&amp;hWndChild );
             ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
             if ( hWndChild )
             if ( hWndChild )
             {
             {
Line 97: Line 97:
                 LRESULT lRes;
                 LRESULT lRes;
              
              
                 UINT nMsg = ::RegisterWindowMessage( _T(&quot;WM_HTML_GETOBJECT&quot;) );
                 UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
                 ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&amp;lRes );
                 ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );


                 LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T(&quot;ObjectFromLresult&quot;) );
                 LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
                 if ( pfObjectFromLresult != NULL )
                 if ( pfObjectFromLresult != NULL )
                 {
                 {
                     HRESULT hr;
                     HRESULT hr;
                     hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&amp;spDoc );
                     hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
                     if ( SUCCEEDED(hr) )
                     if ( SUCCEEDED(hr) )
                     {
                     {
                         // Change background color to red
                         // Change background color to red
                         spDoc->put_bgColor( CComVariant(&quot;red&quot;) );
                         spDoc->put_bgColor( CComVariant("red") );
                     }
                     }
                 }
                 }

Latest revision as of 13:51, 21 July 2020

Knowledge Base


Article ID: 249232

Article Last Modified on 9/27/2006



APPLIES TO

  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 4.01 Service Pack 1
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.5



This article was previously published under Q249232

SUMMARY

This article shows how to get the IHTMLDocument2 interface from a HWND. If Microsoft Active Accessibility (MSAA) is installed, you can send the WM_HTML_GETOBJECT message to the document's window (with the window class "Internet Explorer_Server") and then pass the result from SendMessage to an MSAA function, ObjectFromLresult, to get a fully marshaled IHTMLDocument2 pointer.

MORE INFORMATION

You must have Active Accessibility components installed on the system for the code described in this section to work. Client developers can use the SDK to develop and update Active Accessibility aids. If you incorporate the latest version of Active Accessibility and distribute new versions of your accessibility aids, you must distribute the 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. It's not necessary to include the RDK for clients developed solely for Windows 2000, or for Windows NT 4.0 with Service Pack 6. The new components are already included in these operating systems.

See the "References" section of this article for information about Active Accessibility and where to download the 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();
}
                

NOTE: Before Internet Explorer 5.5, frames were implemented by hosting a new instance of Shdocvw.dll, and each frame had a separate window associated with it. Internet Explorer 5.5 implements native frames for better performance, and all frames are rendered by the same instance of Shdocvw.dll. Since there will not be a HWND for each frame for Internet Explorer 5.5 and later, the sample code described in this section will work to get to the document of the main window only. You can still get to each frame's document by using the frames collection of the main document.

REFERENCES

The SDK for developers and the RDK, which installs the Active Accessibility runtime components onto the operating system, can be downloaded from the following Microsoft Web site:

For information about the Microsoft Active Accessibility support provided by the MSHTML component of Microsoft Internet Explorer, visit the following Web site:

For more information, click the following article number to view the article in the Microsoft Knowledge Base:

176792 How to connect to a running instance of Internet Explorer



Additional query words: active accessibility document object model hwnd

Keywords: kbhowto kbwebbrowser kbmshtml KB249232