C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■90455 / )  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
返信 編集キー/


管理者用

- Child Tree -