人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VB.NETからWebBrowserコンポーネントを組み込みJavaScriptを動かしています。ここで、JavaScriptの変数をVB.NET側からリアルタイムで取得もしくは修正を行いたいのですが、方法をご存じの方は教えてください。(JavaScriptからVB.NETのイベントを呼び出す方法も記載していただけると、なお良しです)

Visual Studio 2008 Professional Edition付属のVisual Basic 2008です。
よろしくお願いいたします。

●質問者: くじぇ
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
●150ポイント

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlwindow.domwindow%28v=vs.80%29.aspx

.NET Framework で、WebBrowser コントロールの Document → Window → DomWindow が、

javascript (正確には、JScript) の window オブジェクトに当たるはずなんです。


javascript で、

<script>
hoge = "aaa"
</script>

みたいになっていれば、WebBrowser1 が WebBrowser のインスタンスだとして、VB.NET 側では、

Dim win As mshtml.IHTMLWindow2 = WebBrowser1.Document.Window.DomWindow
Fuga = win.hoge

というようなコードで、参照できるはずです。

先のリンク先に書いてありますが、MSHTML.dll への参照を定義しておく必要があります。

DomWindow を使用するには、アンマネージ MSHTML.dll への参照を追加する必要があります。


(JavaScriptからVB.NETのイベントを呼び出す方法も記載していただけると、なお良しです)

VB.NET の方から、オブジェクト、もしくは、関数の参照を javascript の変数として設定しておいて、

javascript は、それを呼び出す、という感じになるはずです。


VB.NET 側では、

Dim win As mshtml.IHTMLWindow2 = WebBrowser1.Document.Window.DomWindow
win.callback = ...  '関数への参照 (何かの変換が入るはず)

で、javascript では、

callback.call(...) // 関数オブジェクトの呼び出し

マニュアルを読んだだけなので、激しく自信が無いのですが、何かの参考になれば、と思って。

◎質問者からの返答

a-kuma3さんありがとうございます。

まだ検証していませんが、試してみたいと思います!


くじぇさんのコメント
a-kuma3さんありがとうございます。 今更ながら試してみたのですが、Option Strict Onをしているので Fuga = win.hoge の行で遅延バインディングは使用出来ませんエラーが発生し、うまく行きませんorz

a-kuma3さんのコメント
Dim Fuga As Variant かな?

くじぇさんのコメント
a-kuma3さん、お付き合いいただいていただきありがとうございます。 (うまく登録できないようなので再送します) 残念ながら、Dim Fuga As Variant= win.hoge としても Variant は Objectへ強制的に直され、且つ、win.hogeへの遅延バインディングについて 引き続き警告が発生します。 そこで考え方を変えて、webBrowser1.ObjectForScripting = Meなどから始まる オブジェクトのメソッド呼び出しの呼び出しを、JavaScriptのsetTimeoutから 定期的に呼び出すことで、VB側とJavaScript側変数の同期を取るようにしてみました。 JavaScript例の同期例としてはこんな感じです。 Hensuuが同期したい変数で、DoukiがVB側の関数です。 var timer = false; function win(){ if(timer == false) { setTimeout(function() { if("Hensuu" in window) { window.external.Douki(Hensuu); } else { timer = true; win(); } timer = false; }, 1000); return; } } win(); Web側のソースにこのコードを書き込んでもいいのですが、VBを使用しない ブラウザのテストでエラーが出てしまうのもアレ※ですので VBからJavaScriptを実行させる方法で悩んでいます。 一般的には Webbrowser.Navigate(String.Format("javascript:使いたいJavaScriptの一文")) を使うと良いらしいです。 しかし、実行後リロードするとページが空白になってしまったので 他に良い手はないかと探しています。 よろしくお願いいたします。 ※まぁTry-Catchを使う手もありますが、そちらで手を打って試してみようか…

くじぇさんのコメント
> しかし、実行後リロードするとページが空白になってしまったので > 他に良い手はないかと探しています。 どうも、実行後リロードするとページが空白で表示される問題は JavaScriptを送信することよりも、WebBrowserがキャッシュを表示 しようとすることが表示内容によっては原因になるようなので? キャッシュを使用しないようにリロードさせると私のケースではうまく行きました。 参考: http://homepage1.nifty.com/MADIA/vb/vb_bbs/200409/200409_04090095.html WebBrowserなどでキャッシュさせないようにするには?

くじぇさんのコメント
いや、更に調べるとJavaScriptを送信し始めるタイミングは 送信完了のほうがよさそうです。 ですので、DocumentCompletedイベントで行うのが良いような印象です。

2 ● a-kuma3
●150ポイント

恥のかきついでに、もうひとつ。

(JavaScriptからVB.NETのイベントを呼び出す方法も記載していただけると、なお良しです)

WebBrowser クラスの ObjectForScripting メンバが該当しそう。

イベント呼び出し、というよりは、オブジェクトのメソッド呼び出しです。


http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.objectforscripting%28v=vs.80%29.aspx

ページの真ん中あたりの、使用例を見てください。


VB.NET 側

Imports System.Windows.Forms
Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Form1
 Inherits Form

 ...
 webBrowser1.ObjectForScripting = Me  'javascript から参照できるインスタンスを設定する

 Public Sub Test(ByVal message As String)  'javascript から呼ばれるメソッド
 ...
 End Sub

javascript 側

<script>
window.external.Test(...) 'window.external が ObjectForScripting で指定したインスタンスを指す
</script>

って、ここまで書いてから ken3memo さんのハイクの書き込みを見つけてしまった。

http://h.hatena.ne.jp/ken3memo/225868849616982433

あっ、逆かぁ、JavaScriptからVB.NETかぁ。

またド外し回答を 回答欄に書くところだった。。。

と書いておられるのだけれど、ObjectForScripting は javascript → VB.NET 方向の

参照の仕組みだと思うんです。


# ぼくは、ド外し回答なんて、恐くないんだ (`・ω・´)キリッ

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ