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

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

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

AddHandler Eventの別スレッドについて

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

■90434 / inTopicNo.1)  AddHandler Eventの別スレッドについて
  
□投稿者/ TanuTanu (4回)-(2019/03/11(Mon) 14:26:17)

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

2019/03/11(Mon) 14:31:28 編集(投稿者)
2019/03/11(Mon) 14:31:21 編集(投稿者)

度々、質問してしまい申し訳ありません。
欲が出てしまい『■90409 VB.NETのHTMLDocumentイベントについて』 で追加しましたイベント
を別スレッドで動作させたいのですが出来ますでしょうか?

下記コードでは、buttonをクリックした後、webページダイアログが表示され
そのwebページダイアログを閉じた後にMessageBoxが表示されてしまい困っております。

何卒、ご教授の程宜しくお願いいたします。


Dim Button As mshtml.IHTMLElement = doc.all.item("button")
Event1 = DirectCast(Buttoni, mshtml.HTMLInputTextElementEvents2_Event)
AddHandler Event1.onclick, AddressOf WebDisp_click

Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean

Dim t As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf DoSomething))
t.SetApartmentState(System.Threading.ApartmentState.STA)
t.Start()

End Function

Private Sub DoSomething()

MessageBox.Show("webDisp_onclick")

End Sub

開発環境、使用言語、開発者LV:VS2017、VB.NET、ビギナー
引用返信 編集キー/
■90439 / inTopicNo.2)  Re[1]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 (2098回)-(2019/03/11(Mon) 18:02:21)
No90434 (TanuTanu さん) に返信
> Dim Button As mshtml.IHTMLElement = doc.all.item("button")
この場合、Option Strict Off にしないとコンパイルできなくなりますね。


> Event1 = DirectCast(Buttoni, mshtml.HTMLInputTextElementEvents2_Event)
変数名が違うようですが、ここの "Buttoni" とその直前の "Button" は同じものですか?


> AddHandler Event1.onclick, AddressOf WebDisp_click
この Event1 はローカル変数でしょうか。クラスのインスタンスフィールドでしょうか。
ローカル変数だとしたら、GC されて切断されることを防ぐため、フィールド変数に変更して
イベント通知が不要になるまで、インスタンスを保持しておく必要があります。


> 下記コードでは、buttonをクリックした後、webページダイアログが表示され
元の Web ページ側にダイアログ表示のスクリプトがあるのだと思いますが、
JavaScript 側で既に onclick イベントが割り当てられている場合、
そちらの処理が先に発生し、VB 側に通知されるのはその後になるかと思います。
(イベントの割り当て方法にもよりますが)


> Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean
戻り値を返し忘れていますよ。


> 欲が出てしまい『■90409 VB.NETのHTMLDocumentイベントについて』 で追加しましたイベント
> を別スレッドで動作させたいのですが出来ますでしょうか?
button 要素 の onclick イベントに割り当てたいようですが、どの部分をどのスレッドで動作させたいのでしょうか。

(1) WebDisp_click を、UI スレッド上で実行したい
(2) WebDisp_click を、特定のワーカースレッドで呼び出したい
(3) WebDisp_click を、その都度、新しいスレッドで呼び出したい
(4) Sub DoSomething が、UI スレッド上で呼びだされるようにしたい
(5) Sub DoSomething が、特定のワーカースレッドで呼び出したい
(6) Sub DoSomething が、その都度、新しいスレッドで呼び出したい
(7) 「MessageBox」の呼び出し部のみを、UI スレッドで実行させたい
(8) 「MessageBox」の呼び出し部のみを、特定のワーカースレッドで呼び出したい
(9) 「MessageBox」の呼び出し部のみを、その都度、新しいスレッドで呼び出したい

イベントの発火にしろ、デリゲートの呼び出しにせよ、それが実行されるスレッドは、
「イベント通知を受け取る側/デリゲートインスタンスの生成側」でコントロールするものではなく、
「イベントを発生させる側/デリゲートでメソッドを呼び出す側」でコントロールするものかと。


たとえば RaiseEvent だとしたら、基本的には「イベントの発生元」のスレッドが使われるので、
他スレッドへのイベント通知が必要なら、ISynchronizeInvoke を使うなどします。


呼び出し元に頼らず、イベントを受け取った側で他のスレッドに処理したいなら、
自身を該当スレッド上で Invoke しなおすことで対処してみてください。
たとえば、常に UI スレッド上で処理を行いたいなら、InvokeRequired で判定して Invoke しなおすとか。
引用返信 編集キー/
■90440 / inTopicNo.3)  Re[2]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (5回)-(2019/03/11(Mon) 20:50:47)
魔界の仮面弁士 様

お世話になっております。
返信遅れ申し訳ありません。
自分がもしかしてとんでもなく難しい事しようとしているのでは?
と暫く思考停止になっていました。

ご教授いただいた下記内容でトライしてみようと思います。
>常に UI スレッド上で処理を行いたいなら、InvokeRequired で判定して Invoke しなおすとか。

まだ調査始めたばかりですがC#ばかりでVBの参考サイトが少なく苦慮しておりますが
いろいろ調べてみようと思います。
この度はご教授頂けて本当に助かりました。
解決致しましたら改めてご報告致しますので宜しくお願いいたします。


引用返信 編集キー/
■90441 / inTopicNo.4)  Re[1]: AddHandler Eventの別スレッドについて
□投稿者/ Azulean (1041回)-(2019/03/11(Mon) 21:06:30)
ご自身がやりたいことを端的に書かないと、迷走しますよ。

No90434 (TanuTanu さん) に返信
> 下記コードでは、buttonをクリックした後、webページダイアログが表示され
> そのwebページダイアログを閉じた後にMessageBoxが表示されてしまい困っております。

本題はこの部分ですよね?

現状:ボタンクリック後、Web ページダイアログの次に MessageBox が表示される
希望:ボタンクリック後、MessageBox が表示され、Web ページダイアログが表示される、または MessageBox だけが表示される

この希望の実現方法に、実は「別スレッド」と言うことは関係していません。
知らない状態でそれに気づくことは難しいと思いますが、なおのこと、「現状と実現したいこと」と「試したこととどうなったか」は明確に分離しておかないと、脱線・迷走します。


なお、この「希望」の認識が合っていた場合、魔界の仮面弁士さんの以下の部分が現状を説明していますs。

> 元の Web ページ側にダイアログ表示のスクリプトがあるのだと思いますが、
> JavaScript 側で既に onclick イベントが割り当てられている場合、
> そちらの処理が先に発生し、VB 側に通知されるのはその後になるかと思います。
引用返信 編集キー/
■90444 / inTopicNo.5)  Re[2]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (6回)-(2019/03/12(Tue) 11:11:41)
Azulean 様

ご教授ありがとうございます。

■現状

@ある画面のボタンを手動でクリック
Aそのボタンのonclick イベント発生
B上記ScriptによりWebページダイアログ表示
C手動でWebページダイアログ閉じる
DMessageBox.Show("webDisp_onclick")作動

■実現したい事

@ある画面のボタンを手動でクリック
Aそのボタンのonclick イベント発生
B上記ScriptによりWebページダイアログ表示 & MessageBox.Show("webDisp_onclick")作動

---------------------------------

■試した事

WithEvents doc As mshtml.HTMLDocumentClassでfocusoutイベントをキャッチし
MessageBox.Show("webDisp_onclick")を作動。
この方法では上記実現したい事は実現しますが、ボタンをクリックしなくても
フォーカスアウトする度にイベントが発生してしまうので
MessageBox.Show("webDisp_onclick")の作動条件式が必要になります。

---------------------------------

もし可能であれば、focusoutイベントではなくボタンクリックのAttachEventHandler等で実現したい。

魔界の仮面弁士 様、Azulean 様のご解答では
> そちらの処理が先に発生し、VB 側に通知されるのはその後になるかと思います。
であるように基本不可能と思って間違いないでしょうか?
であれば上記■試した事で作動条件式を作っていく方法で進めたいと思います。

今回、多くの事を教えて頂いたのでそちらも学習したいと思います。
ありがとうございました。
引用返信 編集キー/
■90446 / inTopicNo.6)  Re[3]: AddHandler Eventの別スレッドについて
□投稿者/ PANG2 (266回)-(2019/03/12(Tue) 12:31:54)
2019/03/12(Tue) 12:36:54 編集(投稿者)
No90444 (TanuTanu さん) に返信
>>そちらの処理が先に発生し、VB 側に通知されるのはその後になるかと思います。
> であるように基本不可能と思って間違いないでしょうか?

C#/WebBrowser でイベントの発生順を変えてみました。

private void Form1_Load(object sender, EventArgs e)
{
	this.webBrowser1.DocumentText
		= "<html><body><input id=button1 type=button onclick=\"alert('hello1')\"></body></html>";
}

private void webBrowser1_DocumentCompleted(object sender, EventArgs e)
{
	HtmlElement button = webBrowser1.Document.GetElementById("button1");
#if false
	button.Click += delegate {
		MessageBox.Show("hello2");
	};
#else
	string script = ((dynamic)button.DomElement).attributes("onclick").value; //onclickイベントのスクリプト
	button.SetAttribute("onclick", "");//onclickイベントをクリア
	button.Click += delegate {
		MessageBox.Show("hello2");
		webBrowser1.Navigate("javascript:" + script);//元のonclickイベントを実行
	};
#endif
}

引用返信 編集キー/
■90452 / inTopicNo.7)  Re[4]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (7回)-(2019/03/12(Tue) 13:17:24)
PANG2 様

ご教授ありがとうございます。

その方法は禁断だったのですが・・・

魔界の仮面弁士 様、Azulean 様の下記コメにもあるようにその方法しか残されていないのかもしれませんね。
特にビギナーの私にはそれが一番シンプルですし、、、

>イベントの発火にしろ、デリゲートの呼び出しにせよ、それが実行されるスレッドは、
>「イベント通知を受け取る側/デリゲートインスタンスの生成側」でコントロールするものではなく、
>「イベントを発生させる側/デリゲートでメソッドを呼び出す側」でコントロールするものかと。

もう暫く検討してみて対処方法が他になければPANG2 様にご教授頂いた方法で進めようと思います。

ありがとうございました。

引用返信 編集キー/
■90454 / inTopicNo.8)  Re[3]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 (2100回)-(2019/03/12(Tue) 14:24:57)
No90444 (TanuTanu さん) に返信
この掲示板では、新規投稿時の注意書きに
 『半角カナは使用しないでください。文字化けの原因になります。』
と記載されておりますので、以後の投稿では、
カタカナを全角表記に統一していただけるとありがたいです。


> @ある画面のボタンを手動でクリック

具体例となるものが欲しかったのですが……とりあえずこちらで提示してみます。

下記は onclick 時に、JavaScript 側で confirm メソッドが呼ばれており、
それによって Web ページダイアログが表示される仕様になっています。
ダイアログで OK するとページ遷移、Cancel では何もしないというものです。
https://www.javadrive.jp/javascript/event/sample2_1.html


対してこちらは、onclick と addEventListener の併用です。
Web ページダイアログを表示させるコードは含まれていませんが、
ボタンを押すたびにテキストが書き込まれるようになっています。
https://ozepon.github.io/onclick_vs_addEventListener/



> もし可能であれば、focusoutイベントではなくボタンクリックのAttachEventHandler等で実現したい。

mshtml に、そんなメソッドありましたっけ?

もしかして、System.Windows.Forms.HtmlElement クラスの AttachEventHandler のことでしょうか。
No90410 はマネージ WebBrowser の話であり、今回のような、 COM の InternetExplorer や WebBrowser には
直接的には関係ありません。(マネージ版も内部で COM を呼んでいるので、間接的には関係ありますが)


IHTMLDocument3 の attachEvent メソッドや、
IEventTarget の addEventListener メソッドの事だとしたら、
レンダリングされている HTML ドキュメントに応じて、
 IE5〜IE8 モードの場合 → attachEvent のみをサポート
 IE9〜IE10 モードの場合 → attachEventとaddEventListenerをサポート
 IE11 モードの場合 → addEventListener のみをサポート
だったはず。

また、イベントは登録した順に割り当てられるものであり、発生順を変えることは基本的にできません。

onclick だけなら、イベントの付け外しも比較的容易なのですが、
attachEvent / addEventListener の場合、detachEvent / removeEventListener するには、
登録したリスナー(イベントハンドラとなる function オブジェクト)を入手する手段が必要で。

同一要素に対してイベントを割り当てるのではなく、
親要素・子要素に対してイベントを割り当てるという手はありますが、
いずれにせよ、ページの作りにも左右される事になると思います。
https://qiita.com/hosomichi/items/49500fea5fdf43f59c58
https://qiita.com/landrunner/items/ab162e305fa2e279c219
引用返信 編集キー/
■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
引用返信 編集キー/
■90456 / inTopicNo.10)  Re[5]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 (2102回)-(2019/03/12(Tue) 15:03:23)
2019/03/12(Tue) 15:51:52 編集(投稿者)

No90455 (魔界の仮面弁士) に追記
> それともイベントの発生順は JavaScript → VB の順番のままで構わないので、
> VB 側のイベント処理を「別スレッドで処理させたい」という質問なのでしょうか。

たとえば『AddHandler Event1.onclick, AddressOf WebDisp_click』の割り当てによって
WebDisp_click が呼ばれた際に、メッセージボックスを非同期で表示したいのなら、先ほどの

 Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean
   'これを閉じるまでフォームを操作できない
   MsgBox("webDisp_onclick", MsgBoxStyle.SystemModal)
   Return True
 End Function

というコードの代わりに

 Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean
   Task.Run(Sub()
          'これを開いたままでもフォームを操作できる
          MsgBox("webDisp_onclick", MsgBoxStyle.SystemModal)
        End Sub)
   Return True
 End Function

などと書くことができます。
引用返信 編集キー/
■90458 / inTopicNo.11)  Re[6]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (8回)-(2019/03/12(Tue) 17:37:53)
魔界の仮面弁士 様

サンプル、説明、ソース等々何から何までご教授頂き誠にありがとうございます。
半角カナの件は注意して書く様に致します。

今回、頂いたソースですが、下記の行でエラーが発生しました。

yahooButton.onclick = Nothing '割り当てクリア

エラー:System.NotImplementedException: 'メソッドまたは操作は実装されていません。'

ビルドは出来ましたが、HTML読み込み時にyahooButtonでエラー発生しました。

対処方法をご教授頂きたく存じます。
宜しくお願いいたします。

※Option Strict ON にするとエラー多発の為、OFFにしておりますが、これとは関係ないと思っていいでしょうか?

引用返信 編集キー/
■90461 / inTopicNo.12)  Re[7]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 (2103回)-(2019/03/12(Tue) 18:32:32)
No90458 (TanuTanu さん) に返信
> ※Option Strict ON にするとエラー多発の為、OFFにしておりますが、これとは関係ないと思っていいでしょうか?
当方では、On/Off どちらでも動いていますね。何が違うのだろう?
後ほど、別の PC でもテストしてみます。

なおテスト前には、Internet Explorer 側で [F5] を押すなどして、ページを読み込みなおしておいてください。
先のコードには、クリアした onclick イベントを復元する処理を仕込んでいないためです。
(復元していないため、処理成功後に VB 側を終了させると yahoo ボタンの onclick が無反応になります)


> 今回、頂いたソースですが、下記の行でエラーが発生しました。
> yahooButton.onclick = Nothing '割り当てクリア

その直前までは実行できているのですね。
下記の処理で、メッセージボックスには何が表示されますか?

yahooButton_onclick = yahooButton.onclick
Dim b1 = IsDBNull(yahooButton_onclick)
Dim b2 = IsNothing(yahooButton_onclick)
If b1 OrElse b2 Then
  MsgBox($"DBNull={b1}, Nothing={b2}")
Else
  MsgBox(CallByName(yahooButton_onclick, "toString", CallType.Method))
  yahooButton.onclick = DBNull.Value
End If


> エラー:System.NotImplementedException: 'メソッドまたは操作は実装されていません。'
改変を防止するようなセキュリティソフト等でブロックされているとか…?
引用返信 編集キー/
■90463 / inTopicNo.13)  Re[8]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (9回)-(2019/03/12(Tue) 19:54:56)
魔界の仮面弁士 様

何度もお手数お掛けし申し訳ありません。
ご教授頂いた件、下記の通りとなります。

■Option Strict ON にするとエラー多発の件

以下のようなエラーが多数発生してしまいます。

エラー BC30574 Option Strict On では、遅延バインディングを使用できません。
CreateObject("Shell.Application").Windows

エラー BC30512 Option Strict On では 'Object' から 'InternetExplorer' への暗黙的な変換は許可されていません。
objIE.LocationName

エラー BC30512 Option Strict On では 'Integer' から 'IntPtr' への暗黙的な変換は許可されていません。
PWnd = FindWindowExA(0, 0,・・・

■下記の処理で、メッセージボックスには何が表示されますか?

下記が表示されました。
※ボタン名称は非公開にしております。

function onclick()
{
on Click ボタン名称()
}

■改変を防止するようなセキュリティソフト等でブロックされているとか…?

セキュリティソフトが入っております。

■試しに実施した事

yahooButton.onclick = Nothing 削除してみました。
MsgBox("webDisp_onclick", MsgBoxStyle.SystemModal)は表示されますが、ボタンクリックで表示されるWEBページダイアログが表示されません。

イベントの復元を実装すれば希望する動作になりそうな感じがします。
しかし私には復元方法が解りません。

不躾で申し訳ありませんが何卒宜しくお願いいたします。



引用返信 編集キー/
■90468 / inTopicNo.14)  Re[9]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (10回)-(2019/03/13(Wed) 09:32:09)
 魔界の仮面弁士 様

 お世話になっております。
 本日、教えて頂いたコードを駆使してトライしておりますが、下記コードReturn値のエラーで躓いております。

 ■エラー内容
 
 System.Runtime.InteropServices.InvalidComObjectException
 Message=基になる RCW から分割された COM オブジェクトを使うことはできません。


 ■試した内容

Private Function WebDisp_click(ByVal e As mshtml.IHTMLEventObj) As Boolean

 Task.Run(Sub()
'これを開いたままでもフォームを操作できる
MsgBox("webDisp_onclick", MsgBoxStyle.SystemModal)
End Sub)

 Return CBool(CallByName(yahooButton_onclick, "[DispId=0]", CallType.Method, e))

End Function

"[DispId=0]"のところを元のメソッド名にしたりして、いろいろ変えてみましたが同じエラーになります。

 ご教授頂きたく存じます。
 宜しくお願いいたします。

引用返信 編集キー/
■90469 / inTopicNo.15)  Re[9]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 (2107回)-(2019/03/13(Wed) 09:51:47)
2019/03/13(Wed) 14:39:48 編集(投稿者)

No90463 (TanuTanu さん) に返信
> CreateObject("Shell.Application").Windows

えぇ…。(−ー;
別スレッドである No90411 を含め、今までこんなコードの話は
出ていなかったように思うんですが、どこかで言及されていましたっけ?


上記をレイトバインドで処理したいのであれば、
過去ログの No47158 , No35068 あたりを探ってみてください。


というか上記を使っているのなら、わざわざ API を駆使して
>>> 下記サイトのGetIEDocumentでHTMLDocumentを取得しております。
のような方法を取る必要は無いと思いますよ。

Windows プロパティから得たコレクションを列挙することで、
個々の InternetExplorer オブジェクトを取得できるので、
その Document プロパティにアクセスすれば、
HTMLDocument のインスタンスを得ることができますよね。


> エラー BC30512 Option Strict On では 'Object' から 'InternetExplorer' への暗黙的な変換は許可されていません。
> objIE.LocationName
objIE 変数が As Object なのだとしたら、As SHDocVw.InternetExplorer にしてください。

この場合、参照設定として、
 ・"Microsoft Internet Controls" (SHDocVw)
 ・"Microsoft Shell Controls And Automation" (Shell32)
が必要です。


参照設定を加えずに Option Strict On のままにしたいのであれば、
先日の回答 ( No90410 , No90461 )や、上記過去ログ ( No35068 )などのように、
CallByName を経由してアクセスする必要があります。


> エラー BC30512 Option Strict On では 'Integer' から 'IntPtr' への暗黙的な変換は許可されていません。
> PWnd = FindWindowExA(0, 0,・・・
IntPtr 型の引数に 「0」という Integer 値を渡しているからでしょう。
ここは IntPtr.Zero とすべきです。

さらに言えば、FindWindowExA API ではなく FindWindowExW API を用いた方が望ましいと思います。


> 下記が表示されました。
> ※ボタン名称は非公開にしております。
だとしたら、ターゲットにしているページが間違っています。

取得した HTMLDocument が、先の No90454 で示した
>> https://www.javadrive.jp/javascript/event/sample2_1.html
になっていることを再度確認してみてください。

このページから取得した yahoo ボタンであれば、下記の内容が表示されるはずなんですが…。

---------------------------
function onclick(event)
{
kakunin(1)
}
---------------------------


上記の URL でも問題が生じるなら、環境依存の問題がありそうです。

上記の URL では成功したけれども、目標としている URL だと失敗するのなら、
jQueryのイベントハンドラが使われているなど、そのページ固有の
別の問題がある可能性があるので、具体的な URL なり、
正確なページの内容(HTML & JavaScript)が分からない事には、
情報不足過ぎて答えようが無いです。
引用返信 編集キー/
■90473 / inTopicNo.16)  Re[10]: AddHandler Eventの別スレッド
□投稿者/ TanuTanu (11回)-(2019/03/13(Wed) 14:49:00)
2019/03/13(Wed) 14:59:10 編集(投稿者)
2019/03/13(Wed) 14:58:24 編集(投稿者)

魔界の仮面弁士 様

大変お世話になっております。
新プロジェクトにて■No90455 を試す事にしました。

下記コードにてPWnd1、PWnd2、PWnd3ともに0になってしまいます。
VB.NETでクラス、タイトル、ハンドル列挙する方法が解らず
このようなコードになってしまいました。

初歩的な事で申し訳ありませんがご教授頂きたく存じます。
宜しくお願いいたします。

Option Strict On ・・・プロジェクトプロパティでOnするとエラーになる為、ここに直接記載
Public Class Form1

Dim PWnd1 As IntPtr
Dim PWnd2 As IntPtr
Dim PWnd3 As IntPtr
Dim aShell As SHDocVw.ShellWindows

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

PWnd1 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, vbNullString, "JavaScript テスト")・・・FindWindowExWに変更しました。

Debug.WriteLine(PWnd1)

PWnd2 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "IEFrame", "JavaScript テスト")

Debug.WriteLine(PWnd2)

PWnd3 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "Internet Explorer_TridentDlgFrame", "JavaScript テスト")

Debug.WriteLine(PWnd3)

    ・・・








引用返信 編集キー/
■90474 / inTopicNo.17)  Re[3]: AddHandler Eventの別スレッドについて
□投稿者/ PANG2 (267回)-(2019/03/13(Wed) 16:01:02)
No90444 (TanuTanu さん) に返信

> ■実現したい事
>
> @ある画面のボタンを手動でクリック
> Aそのボタンのonclick イベント発生
> B上記ScriptによりWebページダイアログ表示 & MessageBox.Show("webDisp_onclick")作動

本当のやりたい事は何ですか?
Webページダイアログへの自動応答でしょうか?

Webページダイアログとは何でしょうか?
@confirm関数
Awindow.openによる別窓
BshowModalDialogによるモーダルダイアログ
Cjavascriptによる擬似モーダルダイアログ
が思いつきます。

@は、
javascript:function confirm() {return true;}
を流し込んでconfirm関数を無力化できます。

ABは
NewWindowイベントで拾えるかな。

Cは、
DOMで制御できるでしょう。
引用返信 編集キー/
■90475 / inTopicNo.18)  Re[11]: AddHandler Eventの別スレッド
□投稿者/ 魔界の仮面弁士 (2108回)-(2019/03/13(Wed) 16:03:49)
2019/03/13(Wed) 16:33:20 編集(投稿者)

No90473 (TanuTanu さん) に返信
> PWnd1 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, vbNullString, "JavaScript テスト")・・・FindWindowExWに変更しました。

API 宣言はどうなっていますか?

それと IE11 が対象なら、タイトル部には
"JavaScript テスト - Internet Explorer"
などの文字列になるんじゃないかな…。


> VB.NETでクラス、タイトル、ハンドル列挙する方法が解らず
> このようなコードになってしまいました。

確認するだけなら、spyxx_amd64.exe / spyxx.exe を使うのが簡単です。
プログラムから列挙するなら EnumWindows API です。

ただ、ビギナーの段階で API を多用したコードを書く事はあまりお奨めしません。

InternetExplorer を対象に捉えるなら、API を使うのではなく、
CreateObject("Shell.Application").Windows 相当の処理を用いた方が手っ取り早いかと。

IE ではなく、その他のアプリ上で使われている WebBrowser 内のドキュメントを捕らえるなら、
No90411 の GetIEDocument のように WM_HTML_GETOBJECT + ObjectFromLresult が必要ですが。
引用返信 編集キー/
■90476 / inTopicNo.19)  Re[4]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu (12回)-(2019/03/13(Wed) 16:55:51)
PANG2 様

気に留めて頂きありがとうございます。
内容を整理し改めてPANG2様にご教授頂いた下記コードの方法で出来るか試しましたが、
VB.NETを触り始めて日が浅い事、小生の知識が乏しい故にVB.NETへの変換が出来ませんでした。
又、既に表示されたIEを制御しているのでGetIEDocumentを使用しておりますが、
webBrowser1の部分をどのように改造すれば良いのか、+= delegateの部位をどのように
改造すれば良いのかも解らず心苦しいばかりでございます。

ご質問の件ですがCのjavascriptによる擬似モーダルダイアログだと思います。
onclickイベント=自作onclickイベント+元のonclickイベントにする事が目的です。

何卒、ご教授賜りたく存じます。

string script = ((dynamic)button.DomElement).attributes("onclick").value; //onclickイベントのスクリプト
button.SetAttribute("onclick", "");//onclickイベントをクリア
button.Click += delegate {
MessageBox.Show("hello2");
webBrowser1.Navigate("javascript:" + script);//元のonclickイベントを実行
引用返信 編集キー/
■90477 / inTopicNo.20)  Re[5]: AddHandler Eventの別スレッドについて
 
□投稿者/ TanuTanu (13回)-(2019/03/13(Wed) 20:27:51)
魔界の仮面弁士 様

大変お世話になっております。
ご教授頂いた方法で少し前進致しました。

FindWindowExWの値は0ですが、FindWindowではハンドル値取得できました。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

PWnd1 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "TabThumbnailWindow", "JavaScript テスト - Internet Explorer")
PWnd2 = FindWindow("TabThumbnailWindow", "JavaScript テスト - Internet Explorer")

Debug.WriteLine(PWnd1)
Debug.WriteLine(PWnd2)

Dim o As Object = GetIEDocument(PWnd2) ' 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

その結果、yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)の行にて下記エラーが発生致しました。

 エラー:System.NullReferenceException
HResult=0x80004003
Message=オブジェクト参照がオブジェクト インスタンスに設定されていません。

******************************

 現在、取り組んでいる案件は、下記の通りです。
 
 WEBページ・・・CreateObject("Shell.Application").Windowsで対応しております。
  ↓
 上記WEBページから派生したWEBページダイアログ ・・・ GetIEDocument で対応(現在、ここのボタンクリックのイベントを対応しております。)
  ↓
 上記WEBページダイアログから派生したWEBページダイアログ ・・・ GetIEDocument で対応

何卒、ご教授の程、宜しくお願いいたします。

引用返信 編集キー/

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

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -