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


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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/20 10:12:47
  • 終了:2011/09/27 10:15:02

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4363ベストアンサー獲得回数18002011/09/22 19:31:58

ポイント150pt

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(...)    // 関数オブジェクトの呼び出し

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

id:halohalolin

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

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

2011/09/22 22:08:57
他3件のコメントを見る
id:halohalolin

> しかし、実行後リロードするとページが空白になってしまったので
> 他に良い手はないかと探しています。

どうも、実行後リロードするとページが空白で表示される問題は
JavaScriptを送信することよりも、WebBrowserがキャッシュを表示
しようとすることが表示内容によっては原因になるようなので?
キャッシュを使用しないようにリロードさせると私のケースではうまく行きました。

参考:
http://homepage1.nifty.com/MADIA/vb/vb_bbs/200409/200409_04090095.html
WebBrowserなどでキャッシュさせないようにするには?

2012/06/15 22:47:49
id:halohalolin

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

2012/06/18 13:41:52
id:a-kuma3 No.2

a-kuma3回答回数4363ベストアンサー獲得回数18002011/09/22 22:55:19

ポイント150pt

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

(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 方向の

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


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

  • id:halohalolin
    VBのStatusStripって、WebBrowser上で動作するJavaScriptのwindow.statusと共有化できるんでしたっけ??(未検証)

    rscさんありがとうございます。
  • id:ken3memo
    少し方向性が違うかもしれませんが、
    http://dobon.net/vb/bbs/log3-16/9706.html
    を参考にして、本物のボタンやダミーのオブジェクトを作ったりして、WebBrowser上で発生するイベントに対して処理を書いてみるとか?
    想像で書いたので、外しているかもしれませんが、解決の糸口となれば...

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません