質問

これまで、次の関数を使用して、実行中のInternet ExplorerインスタンスへのIWebBrowser2ポインターを取得しました(PIDが指定されている場合)。

static SHDocVw::IWebBrowser2Ptr findBrowserByPID( DWORD pid )
{
    SHDocVw::IShellWindowsPtr ptr;
    ptr.CreateInstance(__uuidof(SHDocVw::ShellWindows));
    if ( ptr == NULL ) {
        return 0;
    }

    // number of shell windows
    const long nCount = ptr->GetCount();

    // iterate over all shell windows
    for (long i = 0; i < nCount; ++i) {
        // get interface to item no i
        _variant_t va(i, VT_I4);
        IDispatchPtr spDisp = ptr->Item(va);

        SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
        if (spBrowser != NULL) {
            // if there's a document we know this is an IE object
            // rather than a Windows Explorer instance
            HWND browserWindow;
            try {
                browserWindow = (HWND)spBrowser->GetHWND();
            } catch ( const _com_error &e ) {
                // in case ->GetHWND() fails
                continue;
            }

            DWORD browserPID;
            GetWindowThreadProcessId( browserWindow, &browserPID );
            if ( browserPID == pid ) {
                return spBrowser;
            }
        }
    }
    return 0;
}

CreateProcess を介して explorer.exe プロセスを起動し、上記の関数を使用してIWebBrowser2Ptrを取得します(これにより、ブラウザ)。

残念ながら、IE8はプロセスを再利用するように思われるため、少なくともある程度はInternet Explorer 8では動作しないようです。次のような2つのコードシーケンスの場合:

PROCESS_INFORMATION pi;
// ...

if ( CreateProcess( ..., &pi ) ) {
    // Wait a bit to give the browser a change to show its window
    // ...

    IWebBrowser2 *pWebBrowser = findBrowserByPID( pi.dwProcessId );
}

このコードの最初の実行は正常に機能し、2番目の実行ではpWebBrowserウィンドウを取得することはできません。

少しデバッグした後、 findBrowserByPID 関数は多くのブラウザーウィンドウを検出します(2番目のブラウザーインスタンスを起動するとさらに多くを検出します)が、それらのいずれも新しくプロセスを開始しました。すべてのウィンドウは、開始された最初のIEプロセスに属しているようです。

IE8インスタンスへのIWebBrowser2ポインターを取得する別の方法を知っている人はいますか?または、IE8でプロセスのこの見かけの「再利用」を無効にする方法はありますか?

役に立ちましたか?

解決

IEプロセスを自分で起動する場合は、CreateProcessを使用しないでください。代わりに、CoCreateInstanceを使用してください。これにより、IWebBrowser2を照会できるオブジェクトが返され、自由に使用できます。 1つの複雑さは、ナビゲーションが整合性レベル(Vista +)を超えると、ポインターが無効になることです。この問題に対処するには、NewProcessイベントを同期します。これにより、この状態を検出できます。

ここで詳細を参照してください: http:/ /msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx

他のヒント

いくつかの代替アプローチは次のとおりです:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top