0

基本的に、私がやろうとしているのは、bgDivBing の要素から背景画像を取得し、それをフォームの背景として使用することです。これは私がこれまでに持っているものです。

Try
    With bingCheck
        Dim bgDiv As HtmlElement = .Document.GetElementById("bgDiv")
        Dim imgUrl As String = bgDiv.Style("background-image").ToString

        Dim request As HttpWebRequest = DirectCast(HttpWebRequest.Create(imgUrl), HttpWebRequest)
        Dim response As Net.HttpWebResponse = DirectCast(request.GetResponse, Net.HttpWebResponse)
        Dim grabbedImage As Image = Image.FromStream(response.GetResponseStream)
        response.Close()

        Me.BackgroundImage = grabbedImage
        Me.Update()
    End With
Catch ex As Exception
End Try

これはうまくいかないようですが、どうすればできるかについて他のアイデアはありますか?

4

2 に答える 2

1

まず最初に、文字列に対して (文字列キーを使用して) インデクサーを呼び出そうとすると、整数インデクサーしかないため、エラーが発生します。あなたはこれを見ることでこれを知ることができますSystem.Windows.Forms.HtmlElement.Style property:

現在の要素のスタイルのコンマ区切りリストを取得または設定します。

現在要素にあるすべてのスタイルを返しますが、長い文字列として返されます。別の方法で値を取得するには、他に 2 つの方法があります。以下を参照してください。

Style プロパティの内容を見ると、次のものが含まれています。

"左: 0px; 上: -0.5px; 幅: 1000px; 高さ: 563px; 不透明度: 1; 背景画像: url("http://be.bing.com/az/hprichbg?p=rb%2fPenzanceHarbor_ROW9689010992_1366x768. jpg");"

このメソッドを使用すると、値を簡単に取得できます。

Dim bgimage As String
bgimage = Array.Find(Of String)(bgDiv.Style.Split("; "),
                                Function(s As String) s.Contains("background-image")) _ 
          .Replace("background-image:", "") _
          .Trim()

しかし、まだ 1 つの問題があります。最後の段落を参照してください。

それらの2つの他の方法について。

最初の方法は、HtmlDocument.InvokeScript(String, Object()) Method. これは、指定されたパラメーターを使用して特定の JavaScript 関数を実行し、その関数の (戻り) 値を返します。さて、どの機能が使えるでしょうか?これには、要素evalの背景画像を返す式を使用できます。bgDivコードは次のようになります。

Dim bgimage As String
bgImage = bingCheck _
          .Document _
          .InvokeScript("eval",
                        {"window.getComputedStyle(document.getElementById(""bgDiv"")).backgroundImage"})

次の値を返します。

url("http://be.bing.com/az/hprichbg?p=rb%2fPenzanceHarbor_ROW9689010992_1366x768.jpg")

ここから URL を抽出するのは非常に簡単だと思います。

2 番目の方法は、COM オブジェクト自体にアクセスすることです。これには を参照する必要がありますMicrosoft HTML Object Library(これは COM 参照です!!)。mshtmlその後、名前空間を使用できます。

コードで bgDiv 要素を取得した後、DomElement を COM オブジェクトにキャストすると、そこからプロパティにアクセスできます。次のコードはそれを行います:

Dim bgDiv As HtmlElement = bingCheck.Document.GetElementById("bgDiv")
Dim bgimage As String = DirectCast(bgDiv.DomElement, mshtml.IHTMLElement2) _
                        .currentStyle _
                        .backgroundImage

bgimage 変数では、前の方法と同じ出力が見つかります。

url("http://be.bing.com/az/hprichbg?p=rb%2fPenzanceHarbor_ROW9689010992_1366x768.jpg")

私が前に話していた問題は何ですか?WebBrowser.DocumentCompleted eventCSS はまだ適用されていない (常に適用されているわけではない)ため、 を使用することはできません。そのため、getComputedStyle関数 (またはStyleプロパティ) はNothing背景画像と引き換えに提供します。タイマーを使用してプロパティを探すか、ページがロードされた後に手動でクリックするボタンを使用できます (クリック イベントで背景画像を取得します)。

于 2012-11-05T21:35:18.200 に答える
0

MSDN によると、HtmlElement のスタイル プロパティは文字列です。

http://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelement.style.aspx

セミコロンで区切られた名前と値のペアです。

style-name1:value1;...;[style-nameN:valueN;]

したがって、必要な値を解析する必要があります。

Dim styles as String() = bgDiv.Style.Split(";")
于 2012-11-05T21:36:20.263 に答える