電子書籍の厳選無料作品が豊富!

WebBrowserを使ってgoogle検索をVBで作ったブラウザ上で行いたいです。
具体的には、
「ComboBoxで選択した値」と「TextBoxで書き込んだキーワード」を
&検索したいのですが

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text
WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = ComboBox1.SelectedItem
WebBrowser1.Document.Forms(0).InvokeMember("submit")
End Sub

では、&検索ができません。常にコンボボックスで選択されたものだけが
検索され、しかも無限に検索をします。
対処法を教えていただけないでしょうか?

A 回答 (4件)

ANo.1です。


DocumentCompletedは、ページが読み込まれるたびに呼ばれるルーチンですから・・・
個人的にはフラグを設定するだけで、別の終了待ちルーチンでループで待つってのを書くと思いますので、以下みたいです。
ついでにタイムアウトの場合も考えた方がいいと思います。
追加でbutton1が必要です。

Private isComplete As Boolean = False
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
isComplete = True
End Sub
Private Function waitCompleted() As Boolean
Do While Not isComplete = True
Application.DoEvents()
'タイムアウトチェック
'タイムアウトなら、
'MsgBox("タイムアウトです")
'WebBrowser1.Stop '現在のNavigateを中止するのはこれだったっけ?(自信なし)
'isComplete = False '一応チェック以降に終わったという場合に備えて
'Return False
Loop
isComplete = False '次に備えて
Return True
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WebBrowser1.Navigate("http://www.google.co.jp")
If waitCompleted() = False Then
Exit Sub
End If
WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem
WebBrowser1.Document.Forms(0).InvokeMember("submit")
waitCompleted()
End Sub

p.s.
ちなみに、こんなページがあるので、DocumentCompletedだけでチェックするのはまずいのかもしれない
http://dobon.net/vb/bbs/log3-26/15422.html
http://feedyomi.blog32.fc2.com/blog-entry-73.html
    • good
    • 0

待機する理由がページを完全に読み込んでからでないと、



  GetElementsByName("q")

などでフォームエレメントにアクセスできない、結果検索キーワードを
セットできない...という話であれば最初から Google に検索パラメータ
付きの URL を投げれば良いのでは?

DOM の解析(検索結果によって分岐させるなど)処理が続かないなら、
Http Request も少なくて済むし、効率的だと思いますが...

' // 要参照 System.Web(System.Web.dll) --> HttpUtility 使用のため

' // Google 設定
' // IDE に貼り付けると URL 記載部の前後が多少文字化けしますので
' // 修正して下さい
Private Const QRYURL As String = "http://www.google.com/search?q="
Private Const PARAMS As String = "&num=20&ie="
Private Const CHRSET As String = "UTF-8"

Private Sub Form1_Load( _
    ByVal sender As Object, _
    ByVal e As System.EventArgs _
) Handles Me.Load
  With Me.ComboBox1
    .Items.Add("DocumentComplete MSDN")
    .Items.Add("WebBrowser サンプル")
  End With
End Sub

Private Sub ComboBox1_SelectedIndexChanged( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs _
) Handles ComboBox1.SelectedIndexChanged

  Dim Enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(CHRSET)
  Dim Kwd As String = ComboBox1.Text

  If Kwd.Length > 0 Then
    ' // 検索キーワードを UrlEncode する
    Kwd = System.Web.HttpUtility.UrlEncode(Kwd, Enc)
    ' // Google 問い合わせ
    WebBrowser1.Navigate(QRYURL + Kwd + PARAMS + CHRSET)
  End If

End Sub

ご参考までに。

 # TextBox と ComboBox のキーワード連結の件は #1 ご回答で解決
 # したようですから ComboBox のみに省略させてもらいました
    • good
    • 0

DocumentComplatedでも構わないと思いますよ


ただ 検索するかどうかを判定すればいいだけです
現在の TextBoxとComboBoxの内容と WebBrowserのテキストボックスとを見比べて 違えばsumbitを実行
同じなら何もしないとしてやればいいでしょう

Dim sSearch
sSearch = TextBox1.Text & " " & ComboBOx1.SelectedItem
if WebBrowser.Document.All.GetElementByName("q")(0).innerText <> sSearch then
  WebBrowser.Document.All.GetElementByName("q")(0).innerText = sSerarch
  WebBrowser.Document.Forms(0).InvokeMember( "submit")
end if
といった具合です

この回答への補足

教えていただいた例では&検索はできるのですが、
やはり無限に検索をし、止まってくれません。
この場合、他のソースに問題があるのでしょうかね。

C言語で言うbreakみたいのがあればなぁとは思うのですが。

補足日時:2008/01/04 23:43
    • good
    • 0

詳しくはわからないのですが・・・



>常にコンボボックスで選択されたものだけが検索され、
WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text
WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = ComboBox1.SelectedItem

では、ComboBox1.SelectedItemだけが有効になってしまうので、

WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem

とかにしないといけないんじゃないかと思います。

>しかも無限に検索をします。
Private Sub WebBrowser1_DocumentCompleted
に、このコードがあれば、読み込みが終了->このコード->読み込み->読み込みが終了->このコード->・・・
という状態ではないでしょうか?

この回答への補足

>WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem

まさにこれです。おかげで&検索ができました!ありがとうございます。

>Private Sub WebBrowser1_DocumentCompletedに、このコードがあれば、

なるほど!だから検索しまくっていたんですね。では、
WebBrowser1.Document.All.GetElementsByName("q")(0).InnerText = TextBox1.Text & " " & ComboBox1.SelectedItem
をどこにおけば読み込みの無限ループは止まるのでしょうか?

よろしければご意見のほどをお願いします。

補足日時:2008/01/04 22:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!