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

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

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

VB.NETのHTMLDocumentイベントについて

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■90409 / inTopicNo.1)  VB.NETのHTMLDocumentイベントについて
  
□投稿者/ TanuTanu (1回)-(2019/03/08(Fri) 18:15:47)

分類:[VB.NET/VB2005 以降] 

VBAからVS2017に移行したVB.NET初心者です。

VBAではHTMLDocumentのイベント処理は簡単に出来ましたが、

VB.NETでは、Dim WithEvents doc As HTMLDocument ではイベント表示すらされません。

これは出来ないってことなのでしょうか?

宜しくお願いいたします。

開発環境、使用言語:VS2017、VB.NET

引用返信 編集キー/
■90410 / inTopicNo.2)  Re[1]: VB.NETのHTMLDocumentイベントについて
□投稿者/ 魔界の仮面弁士 (2090回)-(2019/03/08(Fri) 18:19:12)
2019/03/08(Fri) 20:13:06 編集(投稿者)

No90409 (TanuTanu さん) に返信
> VBAではHTMLDocumentのイベント処理は簡単に出来ましたが、
> VB.NETでは、Dim WithEvents doc As HTMLDocument ではイベント表示すらされません。

System.Windows.Forms.HtmlDocument クラスをお使いでしょうか。
その場合は、Click / Focusing/ MouseMove などの基本的なイベントを
WithEvents や AddHandler で扱えるはずです。
(HtmlWindow クラスなら、Load / Resize / Scroll イベント等)

http://bbs.wankuma.com/index.cgi?mode=al2&namber=51775&KLOG=87


その他のイベントの場合は、AttachEventHandler メソッドを試してみてください。
(VBA 同様、ActiveX 版の HTMLDocument オブジェクトを利用することもできます)



Public Class Form1
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  WebBrowser1.Navigate("http://bbs.wankuma.com/index.cgi?mode=al2&namber=90409")
 End Sub

 Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
  Dim doc = WebBrowser1.Document
  doc.AttachEventHandler("onmousemove", Sub(o, arg) document_onmousemove(doc))
  doc.AttachEventHandler("onkeypress", Sub(o, arg) document_onkeypress(doc))
 End Sub

 Private Sub document_onmousemove(doc As HtmlDocument)
  Dim ev As New EventObject(doc.Window)
  Dim pt As New Point(ev.GetInt("x"), ev.GetInt("y"))
  Dim client As New Point(ev.GetInt("clientX"), ev.GetInt("clientY"))
  Dim offset As New Point(ev.GetInt("offsetX"), ev.GetInt("offsetY"))
  Dim src As Object = ev.Get("srcElement")

  TextBox1.Text = $"{pt}, {client}, {offset}, <{CallByName(src, "tagName", CallType.Get)}>"
 End Sub

 Private Sub document_onkeypress(doc As HtmlDocument)
  Dim ev As New EventObject(doc.Window)
  Dim altKey = CBool(ev.Get("altKey"))
  Dim ctrlKey = CBool(ev.Get("ctrlKey"))
  Dim shiftKey = CBool(ev.Get("shiftKey"))
  Dim keyCode As Char = ChrW(ev.GetInt("keyCode"))

  Dim s As String = keyCode
  If altKey Then s &= " + Alt"
  If ctrlKey Then s &= " + Ctrl"
  If shiftKey Then s &= " + Shit"

  TextBox2.Text = s
 End Sub
 Private Class EventObject
  Private ev As Object
  Public Sub New(win As HtmlWindow)
   ev = CallByName(win.DomWindow, "event", CallType.Get)
  End Sub
  Public Function [Get](memberName As String) As Object
   Return CallByName(ev, memberName, CallType.Get)
  End Function
  Public Function GetInt(memberName As String) As Integer
   Return CInt([Get](memberName))
  End Function
 End Class
End Class
引用返信 編集キー/
■90411 / inTopicNo.3)  Re[2]: VB.NETのHTMLDocumentイベントについて
□投稿者/ TanuTanu (2回)-(2019/03/08(Fri) 23:27:07)
魔界の仮面弁士 様
早速のご助言ありがとうございます。VBAの時は大変お世話になりました。
まさか崇拝する魔界の仮面弁士 様からご助言頂けるとは思っていませんでしたので夢のようです。

詳細を明記しますと 既に起動してあるIEをフック→WEBページダイアログが表示された後、マルチスレッド内にて
下記サイトのGetIEDocumentでHTMLDocumentを取得しております。

https://log.windows78.net/2015/06/1404/

実施したい事は、上記WEBページダイアログをフックすることです。

ご助言頂いたコードでWebBrowser1は使用しておりませんのでこの部分は使えないのかもしれませんが

doc.AttachEventHandler("onmousemove", Sub(o, arg) document_onmousemove(doc))をfocusoutイベントにすれば
何とかなりそうかなと考えております。

本当は、WEBページダイアログのInternet Explorer_Serverをフックしたかったのですが小生の知識では不可能でした
ので教えて頂いた内容で対応したいと思います。

ありがとうございます。


引用返信 編集キー/
■90415 / inTopicNo.4)  Re[3]: VB.NETのHTMLDocumentイベントについて
□投稿者/ 魔界の仮面弁士 (2092回)-(2019/03/09(Sat) 13:56:42)
No90411 (TanuTanu さん) に返信
> VBAの時は大変お世話になりました。
> まさか崇拝する魔界の仮面弁士 様からご助言頂けるとは思っていませんでしたので夢のようです。

何の件でお世話したのかは記憶に無いですが (^_^;)
お役に立てていたようであれば嬉しいです。


> 下記サイトのGetIEDocumentでHTMLDocumentを取得しております。

WM_HTML_GETOBJECT から COM インターフェイスを得られていて、
そこから onfocusout イベントを拾いたいのであれば、

(1) 参照設定で [COM] - "Microsoft HTML Object Library" を加える。

(2) ソリューション エクスプローラーで 参照 の下にある MSHTML を
 選択して、プロパティの "相互運用型の埋め込み" を False にする。

(3) Private WithEvents doc As mshtml.HTMLDocumentClass
 を宣言しておいて、
  doc = TryCast(GetIEDocument(p), mshtml.HTMLDocumentClass)
 とする。

とすれば受け取れます。
引用返信 編集キー/
■90431 / inTopicNo.5)  Re[4]: VB.NETのHTMLDocumentイベントについて
□投稿者/ TanuTanu (3回)-(2019/03/11(Mon) 11:10:11)
魔界の仮面弁士 様

ありがとうございます。
無事、WEBページダイアログをフックする事に成功致しました。
初心者なのでよく解りませんがTryCastはなくても動作しました。
魔界の仮面弁士様のような神様にここまで詳しくご教授頂けた私は誠に幸せ者です;;

過去に魔界の仮面弁士様に特に助けて頂いたコードは下記BBSのものになります。
このコードにたどり着けなかったら今の私はいませんので、それ以来、魔界の仮面弁士様は
私の中ではずっと神様です。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200505/05050018.txt

この度は本当にありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ