AxWebBrowserのページ検索とキャッシュを読み込まないようにするには?

解決


あき  2007-12-12 13:03:44  No: 138385  IP: 192.*.*.*

VB2005とAxWebBrowserを使用してちょっとしたブラウザを作成しています。

テキストボックスに検索文字を入力し、検索ボタンをクリックすると、
AxWebBrowserに表示されているページ上で見つかった検索語句をハイライトし、
最初に見つかった位置までスクロールするというところはできたのですが、
再度、検索ボタンを押すと、ハイライトされた語句をハイライトなしに戻す
というところがうまくできません。
どのように修正したら良いのかアドバイス頂けたら幸いです。

Private Sub btnSearchWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchWord.Click
  Static Dim blnHighlight As Boolean = True
  Dim key As String = txtSearchWrod.Text
  If key = vbNullString Then Exit Sub
  Dim className As String = "keyword: " & key
  Dim spanStart As String = "<SPAN class=" & Chr(34) & className & Chr(34) & " style=" & Chr(34) & "background-color: #FFFF63" & Chr(34) & ">"
  Dim spanEnd As String = "</SPAN>"
  If blnHighlight Then
    Dim doc As mshtml.IHTMLDocument2 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument2)
    Dim body As mshtml.IHTMLBodyElement = DirectCast(doc.body, mshtml.IHTMLBodyElement)
    Dim range As mshtml.IHTMLTxtRange = DirectCast(body.createTextRange(), mshtml.IHTMLTxtRange)
    Dim blnFoundFirst As Boolean = True
    Dim BMK As String = vbNullString
    While (range.findText(key, 1, 0))
      range.pasteHTML(spanStart & range.htmlText & spanEnd)
      If blnFoundFirst Then
        '最初に見つかった位置までスクロール
        If Len(BMK) = 0 Then BMK = range.getBookmark
        range.moveToBookmark(BMK)
        range.scrollIntoView()
        blnFoundFirst = False
      End If
    End While
    doc = Nothing
    body = Nothing
    range = Nothing
  Else
    'Object' から 'System.Collections.IEnumerable' への暗黙的な変換です。↓というエラーがでます。
    For Each he As HtmlElement In AxWebBrowser.Document.GetElementsByTagName("SPAN")
      If (he.GetAttribute("className").Equals(className)) Then he.OuterHtml = he.InnerHtml
    Next
  End If
  blnHighlight = Not blnHighlight
End If

また、ページを表示させるときに、キャッシュを読み込んでしまい、
古い情報が表示されることがあるのですが、キャッシュを読み込まずに、
常にサーバーから取得する方法はありますでしょうか?

Private Const navNoHistory As Integer = &H2

AxWebBrowser.Navigate(strUrl, navNoHistory, vbNullString, vbNullString, vbNullString)

としていますが、キャッシュを読み込んでしまいます。

以上、宜しくお願い致しますm(_ _)m

編集 削除
通ってみた  2007-12-13 16:35:13  No: 138386  IP: 192.*.*.*

DeleteUrlCacheEntry  APIでしょうか

編集 削除
あき  2007-12-16 18:57:34  No: 138387  IP: 192.*.*.*

はじめに、載せたコードのTab(インデント)が削除されてしまい、
見にくくなってしまい申し訳ございません。

通ってみたさん、レスありがとうございます。
ページを読み込むための以下の関数を作成し、この関数を実行し
ページを読み込むようにしたところ、
常にサーバーからページを取得するようになり、
この問題は解決できそうです。
ありがとうございます。

'ファイルが存在した場合にキャッシュから関連したファイルを削除する
Private Declare Function DeleteUrlCacheEntry Lib "wininet" _
    Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Integer
Public Sub myPageLoad(ByVal awb As AxSHDocVw.AxWebBrowser, ByVal strUrl As String)
    Const navNoHistory As Integer = &H2
    Dim strUrlTemp As String = strUrl

    If strUrl <> vbNullString Then
        'キャッシュが存在する場合はキャッシュを削除する
        If DeleteUrlCacheEntry(strUrl) <> 0 Then
            Debug.Print(Format(Now, "yyyy/MM/dd HH:mm:ss") & " ○Del : " & strUrl)
        Else
            Debug.Print(Format(Now, "yyyy/MM/dd HH:mm:ss") & " ●Non : " & strUrl)
        End If
    End If
    awb.Navigate(strUrlTemp, navNoHistory, vbNullString, vbNullString, vbNullString)
End Sub

ただ、ちょっと気になったのが、DeleteUrlCacheEntry(strUrl) を実行すると
strUrl の内容が変わってしまうことがあることです。
例えば、
strUrl = "http://www.google.com/search?num=50&lr=lang_ja&q=テスト"
となっていた場合に、
DeleteUrlCacheEntry(strUrl)
を実行後、
strUrl = "http://www.google.com/search?num=50&lr=lang_ja&q=テ"
に置き換わり、awb.Navigate に strUrl を渡してしまうと、
googleでは、"テ"として検索が行われてしまいます。
DeleteUrlCacheEntry への引数は ByVal(値渡し)で宣言しているのに、
ByRef(参照渡し)で渡されているのが気になりました。
とりあえず、DeleteUrlCacheEntry(strUrl)を行う前に、
strUrlTemp という変数に strUrl をコピーし、
awb.Navigate に strUrlTemp を渡すことで回避しました。

もう一方のページ内の検索語句をハイライトした後に、ハイライトなしに戻す方法ですが、
上のコードはC#で書かれていたコードをVB2005へ無理やり書き換えたものなのですが、
For Each he As HtmlElement In AxWebBrowser.Document.GetElementsByTagName
の部分の書き換え方が間違っているようで、
いろいろ試行錯誤していますが、いまだに悩んでおります。
ネットでいろいろ調べているのですが、標準装備の WebBrowser のサンプルはあるのですが、
AxWebBrowser のサンプルがなく先が見えない状態です。
AxWebBrowser で GetElementsByTagName を使用する方法をご存知の方が
いらっしゃいましたら、アドバイス頂けたら幸いです。

編集 削除
Hongliang  2007-12-16 19:18:04  No: 138388  IP: 192.*.*.*

C# のコードでは (型)オブジェクト という形でキャストしていたと思います。
VB では DirectCast や CType を使います。

編集 削除
あき  2008-01-30 13:01:34  No: 138389  IP: 192.*.*.*

Hongliangさん、レスありがとうございました。

検索語句のハイライトON/OFFの件については、
何とか自己解決できましたので報告いたします。

Private Sub btnSearchWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchWord.Click
    Static Dim blnHighlight As Boolean = True
    Dim key As String = txtSearchWord.Text

    If key = vbNullString Then Exit Sub
    Dim className As String = "keyword: " & key
    Dim spanStart As String = "<SPAN class=" & Chr(34) & className & Chr(34) & " style=" & Chr(34) & "background-color: #FFFF63" & Chr(34) & ">"
    Dim spanEnd As String = "</SPAN>"
    If blnHighlight Then
        '検索語句ハイライトON
        Dim doc As mshtml.IHTMLDocument2 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument2)
        Dim body As mshtml.IHTMLBodyElement = DirectCast(doc.body, mshtml.IHTMLBodyElement)
        Dim range As mshtml.IHTMLTxtRange = DirectCast(body.createTextRange(), mshtml.IHTMLTxtRange)
        Dim blnFoundFirst As Boolean = True
        Dim BMK As String = vbNullString
        While (range.findText(key, 1, 0))
            range.pasteHTML(spanStart & range.htmlText & spanEnd)
            If blnFoundFirst Then
                '最初に見つかった位置を保存しておきます。
                If Len(BMK) = 0 Then BMK = range.getBookmark
                range.moveToBookmark(BMK)
                range.scrollIntoView()
                blnFoundFirst = False
            End If
        End While
        doc = Nothing
        body = Nothing
        range = Nothing
    Else
        '検索語句ハイライトOFF
        Dim doc As mshtml.IHTMLDocument3 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument3)
        Dim docelems As mshtml.IHTMLElementCollection = doc.getElementsByTagName("SPAN")
        For Each HtmlElement As mshtml.IHTMLElement In docelems
            If (HtmlElement.getAttribute("className").Equals(className)) Then HtmlElement.outerHTML = HtmlElement.innerHTML
        Next
        doc = Nothing
        docelems = Nothing
    End If
    blnHighlight = Not blnHighlight
End Sub

編集 削除