C++でWebページのラジオボタンをクリックするには

解決


boo  2006-06-19 11:55:01  No: 62222

初心者です。よろしくお願いいたします。
VBAで作成した、ラジオボタンにチェックする動作をC++で
実現したいと考えています。

下記のプログラムは、VBAプログラムです。
動作させるとラジオボタンをチェックします。

-------------------------------
Set objIE = CreateObject("InternetExplorer.application")

For Each objITEM In objIE.document.all
     If objITEM.tagName = "INPUT" Then
            
          If objITEM.Value = "1" Then
               objITEM.Click
               Exit For
          End If
     End If
Next
-------------------------------

C++で表現するとどのようになりますか。
調査した結果、mshtml.tlbを使用することで実現できると考えて
おりますが、ラジオボタンの操作するプログラムの記述がわからない
でいます。

よろしくお願いいたします。

開発環境は、Windows Xp, VC++.netです。


Blue  2006-06-19 16:04:45  No: 62223

参考にしてみてください。
http://www.ujasiri.com/prglib/vc/ie/vc_ie.html


boo  2006-06-25 22:09:55  No: 62224

ここ一週間、試行錯誤してみたのですが、ラジオボタンの制御ができません。

Formの場合、
MSHTML::IHTMLFormElementPtr ppvForm;ですが、

ラジオボタンの場合、わからないです。
どの型で宣言すれば良いでしょうか。

調べ方も教えていただけないでしょうか。


Blue  2006-06-25 23:49:36  No: 62225

ラジオボタンってinputですよね?
> If objITEM.tagName = "INPUT" Then

だったら
http://www.ujasiri.com/prglib/vc/ie/vc_ie_ClickButton.html
と同じようできませんか?


Blue  2006-06-26 02:25:34  No: 62226

サンプル)

// Google検索する
#include <windows.h>
#include <comdef.h>

#import "shdocvw.dll" rename( "FindText", "FindTextIE" )
#import "mshtml.tlb" rename( "TranslateAccelerator", "TranslateAcceleratorHTML" )

HRESULT GoogleSearch( LPCTSTR searchword )
{
    HRESULT hr;

    hr = ::CoInitialize( NULL );
    if ( FAILED( hr ) ) return hr;

    try
    {
        SHDocVw::IWebBrowser2Ptr pBrowser;

        // IEを立ち上げ、Googleの検索ページを表示
        hr = pBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );
        if ( FAILED( hr ) ) _com_issue_error( hr );
        pBrowser->Visible = VARIANT_TRUE;
        pBrowser->Navigate( _bstr_t( L"http://www.google.co.jp/" ) );

        // ページが表示されるまで待つ
        while ( pBrowser->Busy == VARIANT_TRUE ||
                pBrowser->ReadyState != READYSTATE_COMPLETE )
            ::Sleep( 100 );

        MSHTML::IHTMLDocument3Ptr pDocument( pBrowser->Document );
        MSHTML::IHTMLElementCollectionPtr pCollection;

        // 検索文字列を設定
        pCollection = pDocument->getElementsByName( _bstr_t( L"q" ) );
        MSHTML::IHTMLInputTextElementPtr pText( pCollection->item() );
        pText->value = _bstr_t( searchword );

// ※ラジオボタンの操作
        // 日本語のページから検索を選択(2番目のボタン)
        pCollection = pDocument->getElementsByName( _bstr_t( L"lr" ) );
        MSHTML::DispIHTMLInputButtonElementPtr pButton( pCollection->item( 1 ) );
        pButton->click();

        // ウェブ検索ボタンを押す(Submit)
        pCollection = pDocument->getElementsByName( _bstr_t( L"f" ) );
        MSHTML::IHTMLFormElementPtr pForm( pCollection->item() );
        pForm->submit();

        // ページが表示されるまで待つ
        while ( pBrowser->Busy == VARIANT_TRUE || 
                pBrowser->ReadyState != READYSTATE_COMPLETE )
            ::Sleep( 100 );

        //pBrowser->Quit();
    }
    catch ( _com_error& e )
    {
        hr = e.Error();
    }

    ::CoUninitialize();

    return hr;
}

int main()
{
    GoogleSearch( TEXT( "IWebBrowser2Ptr" ) );
    return 0;
}


Blue  2006-06-26 03:08:34  No: 62227

>         MSHTML::DispIHTMLInputButtonElementPtr pButton( pCollection->item( 1 ) );
ですが、VC2005でコンパイルしたときは問題なかったので気づきませんでしたが、
VC6でコンパイルしたところ、_variant_t型の値を渡さなければダメなことがわかりました。

ですので、

インデックスの場合
MSHTML::DispIHTMLInputButtonElementPtr pButton( pCollection->item( _variant_t( 1L ) ) );

名前の場合
MSHTML::DispIHTMLInputButtonElementPtr pButton( pCollection->item( _variant_t( L"il" ) ) );

とします。


boo  2006-06-29 09:51:35  No: 62228

Blueさん、ありがとうございます
ご教示いただいた方法でうまくいきました。


boo  2006-06-29 09:51:36  No: 62229

Blueさん、ありがとうございます
ご教示いただいた方法でうまくいきました。


boo  2006-06-29 09:52:24  No: 62230

Blueさん、ありがとうございます
ご教示いただいた方法でうまくいきました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加