4

Web ブラウザー コントロールを含むフォームがあります。このブラウザ コントロールは、ディスクから HTML をロードして表示します。フォームの HTML アクセス C# コードにボタンを配置できるようにしたいと考えています。

たとえば、HTML のボタンがフォームの Close() メソッドを呼び出す場合があります。

ターゲット プラットフォーム: C# および Windows フォーム (任意のバージョン)

4

6 に答える 6

18

過去にいくつかのアプリケーションでこれを実装しましたが、その方法は次のとおりです。

最初に、Web ブラウザー コントロールで実行されている Javasvcipt から呼び出すパブリック メソッドを含む通常の .NET クラス (パブリック) を作成します。

最も重要なことは、System.Runtime.InteropServices 名前空間の ComVisible(true)] 属性で装飾する必要があることです (IE の Javascript は COM ベースです)。何と呼んでも構いませんが、わかりやすくするために「外部」と呼んでいます。

using System.Runtime.InteropServices;

[ComVisible(true)]
public class External
{
    private static MainWindow m_mainWindow = null;

    public External(MainWindow mainWindow)
    {
        m_mainWindow = mainWindow; 
    }

    public void CloseApplication()
    {
        m_mainWindow.Close();
    }


    public string CurrentDate(string format)
    {
        return DateTime.Now.ToString(format);  
    }
}

次に、Web ブラウザー コントロールを含む .NET フォームで COMVisible クラスのインスタンスを作成し、Web ブラウザー コントロール ObjectForScripting をそのインスタンスに設定します。

    private void MainWindow_Load(object sender, EventArgs e)
    {
         m_external = new External(this);

         browserControl.ObjectForScripting = m_external; 
    }

最後に、Web ブラウザー コントロールで実行されている Javascript で、window.external オブジェクトを介して .NET メソッドにアクセスします。この場合、window.external は、上で作成した「外部」オブジェクトを実際に (COM 相互運用ラッパーを介して間接的に) 参照します。

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}

Javascript から .NET への呼び出しは COM 相互運用層を通過するため、既定のインターフェイスのクエリ、パラメーターのマーシャリングなどを行う必要があることに注意してください。つまり、比較的低速になる可能性があるため、たとえばループ内から複数の呼び出しを行う予定がある場合は、パフォーマンス テストを行ってください。

また、今後の参考のために、.NET から Javascript コードを呼び出す方が簡単です。Document.InvokeScript メソッドを使用するだけです。

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });
于 2008-12-04T06:24:23.597 に答える
9

WebBrowser.ObjectForScriptingプロパティを見てください。これを使用して、GoogleマップをWindowsフォームアプリケーションと通信させることができました。

于 2008-11-20T16:43:25.147 に答える
2

私がVB6でやったこと:

  • HTML ドキュメントに一連のカスタム < A > タグを追加し、href を「#closeform」などの意味のあるものに設定します。
  • BeforeNavigate メソッドで、ブラウザーがアクセスしようとしているアドレスを確認し、それに応じて動作します。次に、ブラウザのナビゲーションをキャンセルします。
于 2008-11-20T16:42:24.743 に答える
0

WebBrowser の Navigating イベントのイベント ハンドラーを追加するだけです。

このイベントは、ブラウザーが次のページに移動する前に発生します。プロセスを中断して、ナビゲーションのキャンセルやコードの呼び出しなど、好きなことを行うことができます。

かなり使いやすいです。私が遭遇した唯一の注意点は、PostData を表示できないことです。ここで私の質問を参照してください: PostData の質問

サンプルコードは次のとおりです。

    private void MyMethod()
    {
        // do something
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        MyMethod();
        e.Cancel = true;
    }
于 2008-11-20T16:41:43.700 に答える
0

これは可能ですが、.NET では実行していません。数年前、Web ブラウザー コントロール (ActiveX) をホストする C++ アプリケーションがありました。コントロール内の HTML から、ActiveX コントロールに「out」を呼び出して、何かを実行させることができました。

HTML DOM/JavaScript は C# を認識しませんが、.NET でも同じことが可能です。しかし、COM オブジェクトで .NET 機能をラップすると、COM/ActiveX オブジェクトのメソッドを呼び出すことができるはずです。これにより、C# コードが呼び出されます。

お役に立てれば。

于 2008-11-20T16:34:08.130 に答える
0

私はこれを数年前に行い、ここでブログを書きました:

http://matthewskelton.wordpress.com/2007/04/21/calling-javascript-from-c/

具体的には、Type.InvokeMember()C# から JavaScript を呼び出すために使用できます。

于 2012-03-06T21:11:26.010 に答える