Web ブラウザー コントロールを含むフォームがあります。このブラウザ コントロールは、ディスクから HTML をロードして表示します。フォームの HTML アクセス C# コードにボタンを配置できるようにしたいと考えています。
たとえば、HTML のボタンがフォームの Close() メソッドを呼び出す場合があります。
ターゲット プラットフォーム: C# および Windows フォーム (任意のバージョン)
Web ブラウザー コントロールを含むフォームがあります。このブラウザ コントロールは、ディスクから HTML をロードして表示します。フォームの HTML アクセス C# コードにボタンを配置できるようにしたいと考えています。
たとえば、HTML のボタンがフォームの Close() メソッドを呼び出す場合があります。
ターゲット プラットフォーム: C# および Windows フォーム (任意のバージョン)
過去にいくつかのアプリケーションでこれを実装しましたが、その方法は次のとおりです。
最初に、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" });
WebBrowser.ObjectForScriptingプロパティを見てください。これを使用して、GoogleマップをWindowsフォームアプリケーションと通信させることができました。
私がVB6でやったこと:
WebBrowser の Navigating イベントのイベント ハンドラーを追加するだけです。
このイベントは、ブラウザーが次のページに移動する前に発生します。プロセスを中断して、ナビゲーションのキャンセルやコードの呼び出しなど、好きなことを行うことができます。
かなり使いやすいです。私が遭遇した唯一の注意点は、PostData を表示できないことです。ここで私の質問を参照してください: PostData の質問
サンプルコードは次のとおりです。
private void MyMethod()
{
// do something
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
MyMethod();
e.Cancel = true;
}
これは可能ですが、.NET では実行していません。数年前、Web ブラウザー コントロール (ActiveX) をホストする C++ アプリケーションがありました。コントロール内の HTML から、ActiveX コントロールに「out」を呼び出して、何かを実行させることができました。
HTML DOM/JavaScript は C# を認識しませんが、.NET でも同じことが可能です。しかし、COM オブジェクトで .NET 機能をラップすると、COM/ActiveX オブジェクトのメソッドを呼び出すことができるはずです。これにより、C# コードが呼び出されます。
お役に立てれば。
私はこれを数年前に行い、ここでブログを書きました:
http://matthewskelton.wordpress.com/2007/04/21/calling-javascript-from-c/
具体的には、Type.InvokeMember()
C# から JavaScript を呼び出すために使用できます。