■90455 / inTopicNo.9) |
Re[4]: AddHandler Eventの別スレッドについて |
□投稿者/ 魔界の仮面弁士 (2101回)-(2019/03/12(Tue) 14:31:26)
|
2019/03/12(Tue) 14:41:42 編集(投稿者)
■No90452 (TanuTanu さん) に返信 > 魔界の仮面弁士 様、Azulean 様の下記コメにもあるようにその方法しか残されていないのかもしれませんね。
スレッド管理の話とイベントの発生順の話は無関係ですよね…?
質問内容は「イベントの発生順を変更したい」ということではないのでしょうか。
それともイベントの発生順は JavaScript → VB の順番のままで構わないので、 VB 側のイベント処理を「別スレッドで処理させたい」という質問なのでしょうか。
■No90454 (魔界の仮面弁士 ) に追記 > また、イベントは登録した順に割り当てられるものであり、発生順を変えることは基本的にできません。 > > onclick だけなら、イベントの付け外しも比較的容易なのですが、
とりあえず https://www.javadrive.jp/javascript/event/sample2_1.html に対するサンプル。
Option Strict On Public Class Form1 Private doc As mshtml.HTMLDocument Private yahooButton As mshtml.IHTMLElement Private Event1 As mshtml.HTMLInputTextElementEvents2_Event
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim o As Object = GetIEDocument( ターゲットのHWND ) ' No90411 を参照 doc = DirectCast(o, mshtml.HTMLDocument) yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement) Event1 = DirectCast(yahooButton, mshtml.HTMLInputTextElementEvents2_Event) AddHandler Event1.onclick, AddressOf WebDisp_click End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click yahooButton.click() End Sub
Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean MsgBox("webDisp_onclick", MsgBoxStyle.SystemModal) Return True End Function End Class
この場合、input type="button" に対する onclick が割り当て済みなので、 その後で VB からイベントにアタッチしても、JavaScript 側の処理が先に実行されます。 そのため VB の WebDisp_click が呼ばれるのは、Web ページダイアログが閉じられた後になります。
上記の順番を入れ替えて、VB 側で捕らえてから JavaScript 側の処理を実行させるようにするなら、たとえばこんな感じ。
Option Strict On Public Class Form1 Private doc As mshtml.HTMLDocument Private yahooButton As mshtml.IHTMLElement Private Event1 As mshtml.HTMLInputTextElementEvents2_Event Private yahooButton_onclick As Object
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim o As Object = GetIEDocument( ターゲットのHWND ) ' No90411 を参照 doc = DirectCast(o, mshtml.HTMLDocument) yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)
yahooButton_onclick = yahooButton.onclick '元の function オブジェクト yahooButton.onclick = Nothing '割り当てクリア
Event1 = DirectCast(yahooButton, mshtml.HTMLInputTextElementEvents2_Event) AddHandler Event1.onclick, AddressOf WebDisp_click End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click yahooButton.click() End Sub
Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean MsgBox("webDisp_onclick", MsgBoxStyle.SystemModal)
Return CBool(CallByName(yahooButton_onclick, "[DispId=0]", CallType.Method, e)) '元の onclick 処理をここで呼び出す End Function End Class
|
|