プロじゃないのでコピペでコーディング!

四半世紀に迫ろうとするベテラン・コピペ・プログラマーが送るコピペの元。 張って動けば良し!動かなければなんで?そんな私をサポートするブログです。 ま、動けば良いと本人が思ってるなら、これでも良いんじゃね?って思ったら生暖かく見守って頂き、こりゃ目に余る!って思ったら、優しく教えてやってください。

C# WebBrowserコンポーネントのサンプル

概要

フォームにWebBrowserコンポーネントを配置し、JavaScriptとNativeの連携をしたり、Nativeから任意のURLへ画面遷移させたり。

詳細

配置するコンポーネントはこれですね。

f:id:kzthrk:20160315233044p:plain

以下のソースコード

を指示しています。

webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.ObjectForScripting = new JavaScript(webBrowser1);
webBrowser1.Navigate(new Uri("http://cheatsheet.hatenablog.com"));

object[] args = { "arg1" };
webBrowser1.Document.InvokeScript("JSfunc1", args);

JavaScript.cs

namespace WindowsFormsApplication1 {

    [System.Runtime.InteropServices.ComVisibleAttribute(true)]

    public class JavaScript {
        private System.Windows.Forms.WebBrowser WebBrowser { get; set; }

        public JavaScript(System.Windows.Forms.WebBrowser dstWebBrowser) {
            this.WebBrowser = dstWebBrowser;
        }

        // JavaScriptから呼ばれるネイティブのメソッド
        public void CSfunc1(string value) {
            MessageBox.Show("CSfunc1: " + value);
        }
    }
}

HTML(JavaScript含む)

<html>
<head>
  <meta charset="UTF-8"> 
  <script>
  function JSfunc1(arg) {
    alert('JSfunc1! : ' + arg);
  }
  
  var jsdata1 = 'jsdata1';
  function clk() {
    window.external.CSfunc1(jsdata1);
  }
  </script>
</head>

<body>
  <input type='button' value='JavaScript To Native' onClick='clk()'>
</body>
</html>

まとめ

あまりおすすめしません。特に、キャッシュ周りとか、確実にはまります。 レンダリングエンジンとかJavaScriptエンジンは、最新なふりはしてくれるのですが、それと同じバージョンのInternet Explorerでの挙動と違う部分があり、それが乗り越えられない部分があります。

間違ってもハイブリッド・アプリ的な考え方で使おうとは思わない方が良いですよ。