tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルIE11にて画面更新後にDOM操作できない
記事No11634
投稿日: 2016/03/05(Sat) 10:59
投稿者IEこまった
いろいろなサイトをめぐった結果ここに何度もたどり着きました。
VB初心者です。

目的としましては、
現在、社内のIEでチームウェアを開き、ブラウザでメールを作成する際に間違って、ブラウザバックや閉じた場合に、それまでに打っていた文章が消えてしまう事象から作成しようと思いました。

既に開いているIEの、最後にアクチィブにしたタブor最前面のタブ(タブ,ウィンドウ複数と仮定)のDOM操作を行いたく、オブジェクト化までを希望します。(できればexcelマクロは使いたくないです・・・)

下記プログラムでは、1つのIEのタブでyahooとgoogleを開いた場合、テストでタブを切り替えてるうちに何故かgoogleだけになります。
いろいろ調べた結果、IE11には画面更新後にSendMessageにてアクチィブ通知をする必要があるらしいです。

ウィンドウ名で探す EnumChildWindows や FindWindowEx では希望通りになりませんでした。

環境は VB.net VS2015 Excel2007 IE11 windows7 32bit です。

皆様の力をどうかお貸ししていただけないでしょうか。

        Dim IE As Object
        Dim ウインドウハンドル As Long
        Dim 現在のURL As string

        ウインドウハンドル = CreateObject("Excel.Application").ExecuteExcel4Macro("CALL(""user32"",""FindWindowA"",""JCJ"",""IEFrame"",0)")

        For Each IE In CreateObject("Shell.Application").Windows()
            If ウインドウハンドル = IE.HWND Then
                Try
                    IE.StatusText = CStr(ウインドウハンドル)
                    '    MsgBox IE.StatusText

                    If IE.StatusText = CStr(ウインドウハンドル) Then Exit For
                Catch ex As Exception
                End Try
            End If
        Next

        If IE Is Nothing Then
                MsgBox("IE6には対応していません。" & vbNewLine & "または、Not Found")
            Else
                現在のURL = CStr(IE.LocationURL)
                '  MsgBox IE.LocationURL
            End If

            Stop

[ツリー表示へ]
タイトルRe: IE11にて画面更新後にDOM操作できない(一応解決)
記事No11635
投稿日: 2016/03/06(Sun) 16:29
投稿者IEこまった
こちらに記事を投稿したものです。
自己解決しましたので結果だけ記載します。

・オブジェクト化までは基本的にできていまして上記で取得できない場合、HTMLdocumentClassでforeachして目的のページかどうかをif exit for判断してみたりに変更

・Marshal.ReleaseComObject →final or 開放までループに変更
↑finalじゃない開放は何に使うんだろうか・・・・
↑あとはエクセルとかを一気に記述していたのを一度変数に格納して後で開放
※エクセルマクロ使わない方法を今度知りたいです。

・DOMアクセスをオブジェ.document.〜にしていたのをInvokeMember or directcastで取得に変更
※よければinvokememberでgetElementByIDする方法を知りたかったです。。
↑domにdocument.byidやbyname等でアクセスしていいのはIE8までなんですね・・・・
↑directcastする場合はMTA→STAで起動しないといけないみたいです。(よく型が違うと怒られました・・・もう全部objectで宣言するぞって言いたくなりましたのは内緒)

・DOMにアクセスする前にsendmessageでWM_ACTIVE通知もしてみました。効果あるかはよくわからなかったです。
↑ページ読み込み待機のie.busyとかreadystate待機も追加しました。


同じ環境で困っている人の少しでも助けになれればと思いました。
また縁がありましたらよろしくお願いします。

[ツリー表示へ]