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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.90434 の関連記事表示

<< 0 | 1 >>
■90434  AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(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、ビギナー
親記事 /過去ログ156より / 関連記事表示
削除チェック/

■90439  Re[1]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(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 しなおすとか。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90440  Re[2]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(2019/03/11(Mon) 20:50:47)
    魔界の仮面弁士 様

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

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

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

記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

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

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

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

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

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


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

    > 元の Web ページ側にダイアログ表示のスクリプトがあるのだと思いますが、
    > JavaScript 側で既に onclick イベントが割り当てられている場合、
    > そちらの処理が先に発生し、VB 側に通知されるのはその後になるかと思います。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90444  Re[2]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(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 側に通知されるのはその後になるかと思います。
    であるように基本不可能と思って間違いないでしょうか?
    であれば上記■試した事で作動条件式を作っていく方法で進めたいと思います。

    今回、多くの事を教えて頂いたのでそちらも学習したいと思います。
    ありがとうございました。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90446  Re[3]: AddHandler Eventの別スレッドについて
□投稿者/ PANG2 -(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
    }
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90452  Re[4]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(2019/03/12(Tue) 13:17:24)
    PANG2 様

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

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

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

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

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

    ありがとうございました。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90454  Re[3]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(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
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90455  Re[4]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(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
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90456  Re[5]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(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

    などと書くことができます。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90458  Re[6]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(2019/03/12(Tue) 17:37:53)
    魔界の仮面弁士 様

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

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

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

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

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

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

    ※Option Strict ON にするとエラー多発の為、OFFにしておりますが、これとは関係ないと思っていいでしょうか?
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90461  Re[7]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(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: 'メソッドまたは操作は実装されていません。'
    改変を防止するようなセキュリティソフト等でブロックされているとか…?
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90463  Re[8]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(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ページダイアログが表示されません。

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

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


記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90469  Re[9]: AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 -(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)が分からない事には、
    情報不足過ぎて答えようが無いです。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90468  Re[9]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(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]"のところを元のメソッド名にしたりして、いろいろ変えてみましたが同じエラーになります。

     ご教授頂きたく存じます。
     宜しくお願いいたします。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90473  Re[10]: AddHandler Eventの別スレッド
□投稿者/ TanuTanu -(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)

        ・・・







記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90475  Re[11]: AddHandler Eventの別スレッド
□投稿者/ 魔界の仮面弁士 -(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 が必要ですが。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90474  Re[3]: AddHandler Eventの別スレッドについて
□投稿者/ PANG2 -(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で制御できるでしょう。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90476  Re[4]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(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イベントを実行
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

■90477  Re[5]: AddHandler Eventの別スレッドについて
□投稿者/ TanuTanu -(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 で対応

    何卒、ご教授の程、宜しくお願いいたします。
記事No.90434 のレス /過去ログ156より / 関連記事表示
削除チェック/

次の20件>

<< 0 | 1 >>

パスワード/

- Child Tree -