Como se conectar a uma instância em execução da Internet Explorer

Aviso

O aplicativo da área de trabalho desativado e sem suporte do Internet Explorer 11 está programado para ser desativado permanentemente por meio de uma atualização do Microsoft Edge em certas versões do Windows 10. Para obter mais informações, consulte Perguntas frequentes sobre a desativação do aplicativo de área de trabalho do Internet Explorer 11.

Você pode usar a coleção SHDocVw.ShellWindows para se conectar a uma instância em execução do Explorer da Internet.

Versão original do produto: Internet Explorer
Número de KB original: 176792

Mais informações

Normalmente, um aplicativo se conecta a uma instância em execução de outro aplicativo usando a Running Object tabela. Como o Explorer da Internet não se registra na tabela de objetos em execução, outro método é necessário.

A coleção ShellWindows é descrita no SDK do Cliente da Internet da seguinte maneira:

O objeto ShellWindows representa uma coleção das janelas abertas que pertencem ao shell. Na verdade, essa coleção contém referências à Internet Explorer bem como outras janelas pertencentes ao shell, como o Windows Explorer.

O código do Visual Basic a seguir obtém uma referência à coleção ShellWindows . A coleção é enumerada e o LocationName para cada objeto adicionado a uma caixa de lista. Se o documento associado ao objeto for do tipo HTMLDocument (uma Página da Web), o título da página será adicionado a outra caixa de lista.

Para executar o código a seguir, é necessário adicionar uma referência aos Controles de Internet da Microsoft (Shdocvw.dll) e à Biblioteca de Objetos HTML da Microsoft (Mshtml.dll) ao projeto do Visual Basic:

Dim SWs As New SHDocVw.ShellWindows
Dim IE As SHDocVw.InternetExplorer

Private Sub Form_Load()
    Dim Doc
    List1.Clear
    List2.Clear

    Text1.Text = SWs.count

    For Each IE In SWs
        List1.AddItem IE.LocationName

        Set Doc = IE.Document
        If TypeOf Doc Is HTMLDocument Then
            'if this is an HTML page, display the title
            'may or may not be the same as LocationName
            List2.AddItem Doc.Title
        End If
    Next
End Sub

No C++, uma conexão pode ser realizada da mesma maneira. O suporte ao COM nativo do Visual C++ é usado aqui por uma questão de brevidade.

Adicione referências a Shdocvw.dll e Mshtml.dll ao projeto:

#import <mshtml.dll> // Internet Explorer 4.0x
#import <mshtml.tlb> // Internet Explorer 5
#import <shdocvw.dll>

Declare uma instância de um ponteiro IShellWindows em sua classe de exibição:

SHDocVw::IShellWindowsPtr m_spSHWinds;

Crie uma instância de um objeto ShellWindows no construtor de sua exibição:

m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));

Use o objeto ShellWindows na função OnInitialUpdate do seu modo de exibição:

void CConnectIEView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();

    ASSERT(m_spSHWinds != NULL);

    CString strCount;
    long nCount = m_spSHWinds->GetCount();

    strCount.Format("%i", nCount);
    m_strWinCount = strCount;

    UpdateData(FALSE);

    IDispatchPtr spDisp;
    for (long i = 0; i < nCount; i++)
    {
        _variant_t va(i, VT_I4);
        spDisp = m_spSHWinds->Item(va);

        SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
        if (spBrowser != NULL)
        {
            m_ctlListLoc.AddString(spBrowser->GetLocationName());

            MSHTML::IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
            if (spDoc != NULL)
            {
                m_ctlListTitle.AddString(spDoc->Gettitle());
            }
        }
    }
}

O método anterior para se conectar a uma instância em execução do Explorer da Internet não funcionará se o Shell Integration não estiver instalado ou se o Browse em um novo processo for selecionado na Internet Explorer.

Se esses fatores não puderem ser controlados, ainda haverá um método possível que pode funcionar. Um objeto auxiliar do navegador pode ser gravado para registrar Explorer da Internet na ROT (tabela de objetos em execução). Há muitas implementações possíveis aqui, dependendo de como o aplicativo deve determinar a instância da Internet Explorer com a qual se conectar. Apenas uma solução possível: o objeto auxiliar do navegador, tendo acesso ao modelo de objeto da instância de Explorer que o iniciou, determinaria se essa é a instância do navegador que deve ser registrada na tabela de objetos em execução.

A interface na qual o consumidor está interessado pode ser registrada no ROT com a função RegisterActiveObject e um CLSID fictício que o consumidor reconhecerá. Outra solução, que permitiria que várias instâncias do explorador fossem registradas no ROT, seria fazer com que o objeto Auxiliar do Navegador composse um moniker item com base em um GUID e um pedaço de dados exclusivos para cada instância da Internet Explorer. O moniker seria registrado no ROT com o IRunningObjectTable::Register método. Novamente, o consumidor teria que saber como reconhecer esse moniker.

Referências

Para obter mais informações sobre o SDK do Windows Shell, consulte Windows Shell.

Para obter mais informações sobre o fornece desenvolvedor específico para Explorer da Internet, consulte Internet Explorer para Desenvolvedores.