11

[わかりやすくするためにもう一度修正]

Web サイトと対話する C++ プログラムがあります。このサイトは IE 固有のものであり、私のプログラムも同様です。

通常の方法で IE の実行中のインスタンスに接続しています (アウト プロセス-- コードを参照)。を取得したら、個々のオブジェクトを取得して操作し、フィールドに入力してボタンをクリックすることにIWebBrowser2問題はありません。IHTMLDocument2IHTMLElement

しかし、Web ページにwindow.showModalDialogを呼び出す JavaScript が含まれている場合、行き詰まります。他のページと同様に、ポップアップ内の HTML 要素を操作する必要があります。しかし、私はそれを取得できないようですIWebBrowser2

ポップアップのタイトルは常に「Web ページ ダイアログ」でInternet Explorer_TridentDlgFrameInternet Explorer_Server. Internet Explorer_Serverしかし、通常の IE インスタンスの場合のように、ウィンドウから IWebBrowser2 を取得することはできません。

を取得できますが、 を取得IHTMLDocument2Ptrしようとすると が取得されます。IWebBrowser2HRESULTE_NOINTERFACE

コードはかなり標準的なもので、「通常の」IE ウィンドウであれば問題なく動作します。

IHTMLDocument2Ptr pDoc;
LRESULT lRes;

/* hWndChild is an instance of class "Internet Explorer_Server" */

UINT nMsg = ::RegisterWindowMessage( "WM_HTML_GETOBJECT" );
::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, 
    (DWORD*)&lRes );

LPFNOBJECTFROMLRESULT pfObjectFromLresult = 
    (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, "ObjectFromLresult" );
if ( pfObjectFromLresult != NULL )
{
    HRESULT hr;
    hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&pDoc );
    if ( SUCCEEDED(hr) ) {
        IServiceProvider *pService;
        hr = pDoc->QueryInterface(IID_IServiceProvider, (void **) &pService);
        if ( SUCCEEDED(hr) )
        {
            hr = pService->QueryService(SID_SWebBrowserApp,
                IID_IWebBrowser2, (void **) &pBrowser);

            // This is where the problem occurs:
            // hr == E_NOINTERFACE
         }
    }
}

重要な場合、これはVistaIE8です。(これらの両方が、XP/IE7 で問題なく動作していたコードベースに重大な変更をもたらしたため、これを強調します。)

繰り返しますが、私の目標は、それぞれを取得IHTMLElementして操作することです。自動化しているアプリケーションのソース コードにアクセスできません。

キーストロークをやみくもにInternet Explorer_Serverウィンドウに送信することを検討していますが、そうではありません。

追加するために編集:

誰かが子ウィンドウを取得してメッセージを送信することを提案しましたが、それは動作しないと確信していInternet Explorer_Serverます。Spy++ によると、子ウィンドウはありません。(これは IE 固有のものではありません。Java アプレットにも子ウィンドウはないようです。)

アップデート

コメントの中で、Simon Maurer は、上記のコードがうまく機能したと述べ、タイプミスがないことを確認するために、完全なスタンドアロン アプリをPastebinに非常に寛大に投稿しました。私が彼のコードを使用すると、同じ場所で同じように失敗し、ポップアップではなく、基になるページに接続したいと彼が考えていることに気付きました。そのため、上記のテキストを編集して、そのあいまいさを取り除きました。

4

1 に答える 1