[わかりやすくするためにもう一度修正]
Web サイトと対話する C++ プログラムがあります。このサイトは IE 固有のものであり、私のプログラムも同様です。
通常の方法で IE の実行中のインスタンスに接続しています (アウト プロセス-- コードを参照)。を取得したら、個々のオブジェクトを取得して操作し、フィールドに入力してボタンをクリックすることにIWebBrowser2
問題はありません。IHTMLDocument2
IHTMLElement
しかし、Web ページにwindow.showModalDialogを呼び出す JavaScript が含まれている場合、行き詰まります。他のページと同様に、ポップアップ内の HTML 要素を操作する必要があります。しかし、私はそれを取得できないようですIWebBrowser2
。
ポップアップのタイトルは常に「Web ページ ダイアログ」でInternet Explorer_TridentDlgFrame
、Internet Explorer_Server
. Internet Explorer_Server
しかし、通常の IE インスタンスの場合のように、ウィンドウから IWebBrowser2 を取得することはできません。
を取得できますが、 を取得IHTMLDocument2Ptr
しようとすると が取得されます。IWebBrowser2
HRESULT
E_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
}
}
}
重要な場合、これはVistaとIE8です。(これらの両方が、XP/IE7 で問題なく動作していたコードベースに重大な変更をもたらしたため、これを強調します。)
繰り返しますが、私の目標は、それぞれを取得IHTMLElement
して操作することです。自動化しているアプリケーションのソース コードにアクセスできません。
キーストロークをやみくもにInternet Explorer_Server
ウィンドウに送信することを検討していますが、そうではありません。
追加するために編集:
誰かが子ウィンドウを取得してメッセージを送信することを提案しましたが、それは動作しないと確信していInternet Explorer_Server
ます。Spy++ によると、子ウィンドウはありません。(これは IE 固有のものではありません。Java アプレットにも子ウィンドウはないようです。)
アップデート
コメントの中で、Simon Maurer は、上記のコードがうまく機能したと述べ、タイプミスがないことを確認するために、完全なスタンドアロン アプリをPastebinに非常に寛大に投稿しました。私が彼のコードを使用すると、同じ場所で同じように失敗し、ポップアップではなく、基になるページに接続したいと彼が考えていることに気付きました。そのため、上記のテキストを編集して、そのあいまいさを取り除きました。