0

どうやら、ケーキを持って食べることはできません。

現在、アプリケーションで を使用しSystem.Windows.Forms.WebBrowserています。プログラムは現在、関数の使用に依存していGetElementsByTagNameます。これを使用して、特定のタイプ (「入力」または「テキストエリア」) のすべての要素を収集するため、それらを並べ替えて、特定の要素の値を返すことができます。これはその関数のコードです (私の WebBrowser は web1 という名前です):

// returns the value from a element.
public String FetchValue(String strTagType, String strName) 
{
    HtmlElementCollection elems;
    HtmlDocument page = web1.Document.Window.Frames[1].Document;
    elems = page.GetElementsByTagName(strTagType);
    foreach (HtmlElement elem in elems)
    {
        if (elem.GetAttribute("name") == strName ||
            elem.GetAttribute("ref") == strName)
        {
            if (elem.GetAttribute("value") != null)
            {
                return elem.GetAttribute("value");
            }
        }
    }

    return null;
}

(注意点: 取得する必要がある Web ページはフレーム内にあり、状況によっては、要素の識別名が name または ref 属性のいずれかに含まれます)

そのすべてが、 で夢のように機能しSystem.Windows.Forms.WebBrowserます。

しかし、それができないのは、新しいウィンドウを開くことをリダイレクトしてアプリケーションに残すことです。新しいウィンドウで開くものはすべて、ユーザーの既定のブラウザーに送信されるため、セッションが失われます。この機能は、持っていないNewWindow2イベントで簡単に修正できます。System.Windows.Forms.WebBrowser

その不在に唖然としたことを許してください。私は最近VB6を捨ててC#に移りました(はい、VB6、どうやら私は岩の下で雇用されているようです)。VB6では、関数とイベントWebBrowserの両方を所有していました。GetElementsByTagNameNewWindow2

AxSHDocVw.WebBrowserにはイベントNewWindow2があります。新しいウィンドウを必要な場所にルーティングするのに役立ちます。THAT でこれを行うコードWebBrowserは次のとおりです (frmNewWindow は web2 と呼ばれる別のフォームのみを含む単純なフォームですWebBrowser(Dock を Fill に設定)):

private void web1_NewWindow2(
                      object sender, 
                      AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
{
    frmNewWindow frmNW = new frmNewWindow();
    e.ppDisp = frmNW.web2.Application;
    frmNW.web2.RegisterAsBrowser = true;
    frmNW.Visible = true;
}

圧倒的な通常の NewWindow イベントでその機能を複製する方法を自分で作成することはできません。

FetchValueを使用して、上記で説明した機能を複製する方法もわかりませんAxSHDocVw.WebBrowser。まったく違う方法で物事を進めるように見え、物事を行う方法についての私の知識はすべて役に立たない.

1 つのアプリケーションでこれら 2 つのものを使用するというこの奇妙なファンタジーについては、私は病気でねじ曲がった男であることを知っています。しかし、あなたはこの愚かな理想主義者を助けることができるでしょうか?

4

3 に答える 3

2

私はもはや回避策に頼ることができず、System.Windows.Forms.WebBrowser を放棄しなければなりませんでした。NewWindow2 が必要でした。

私は最終的に、AxWebBrowser で必要なことを達成する方法を見つけました。私の元の投稿は、System.Windows.Forms.WebBrowser の NewWindow2 のソリューション、または .GetElementsByTagName の AxWebBrowser の代替品のいずれかを求めていました。置き換えには約 4 倍のコードが必要ですが、仕事は完了します。同じ問題に直面した後の Google 社員のために、私の解決策を投稿するのが賢明だと思いました。(これを行うためのより良い方法がある場合にも)

IHTMLDocument2 webpage = (IHTMLDocument2)webbrowser.Document;
IHTMLFramesCollection2 allframes = webpage.frames;
IHTMLWindow2 targetframe = (IHTMLWindow2)allframes.item("name of target frame");
webpage = (IHTMLDocument2)targetframe.document;
IHTMLElementCollection elements = webpage.all.tags("target tagtype");

foreach (IHTMLElement element in elements)
{
  if (elem.getAttribute("name") == strTargetElementName)
   {
     return element.getAttribute("value");
   }
}

webbrowser.Document が IHTMLDocument2 にキャストされ、次に IHTMLDocument2 のフレームが IHTMLFramesCollection2 に入れられます。次に、特定の目的のフレームを IHTMLWindow2 にキャストし (インデックス番号または名前でフレームを選択できます)、フレームの .Document メンバーをキャストします。 IHTMLDocument2 (便宜上、最初に使用されたもの) に変換します。そこから、IHTMLDocument2 の .all.tags() メソッドは、HTMLElementCollection ではなく IHTMLElementCollection を必要とすることを除いて、古い WebBrowser.Document.GetElementsByTagName() メソッドと機能的に同じです。次に、コレクション、IHTMLElement である必要がある個々の要素を foreach し、.getAttribute を使用して属性を取得できます。g は小文字であることに注意してください。

于 2012-03-30T21:28:52.843 に答える
0

私が見たこれに対する唯一の解決策は、数年前に csExWb2 と呼ばれ、現在は Google コードhereにあります。

ExWebBrowser コントロールを提供しますが、IE が提供するすべてのインターフェイスとイベントに完全にアクセスできます。私はそれを使用して、winforms でホストされている html エディターで要素を詳細に制御しました。

それに真っ直ぐに飛び込むのは、ちょっとした飛躍かもしれません。

于 2012-03-21T18:01:30.410 に答える
0

WebBrowser コントロールは NewWindow イベントを処理できるため、新しいポップアップ ウィンドウが WebBrowser で開かれます。

private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{
  // navigate current window to the url
  webBrowser1.Navigate(webBrowser1.StatusText);
  // cancel the new window opening
  e.Cancel = true;
}

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/361b6655-3145-4371-b92c-051c223518f2/

于 2012-03-21T17:51:56.593 に答える