| 2019/03/15(Fri) 12:07:39 編集(投稿者)
解決済みで閉じられているので、いちおうチェックは付けた状態に戻しておきます。
■No90477 (TanuTanu さん) に返信 > その結果、yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)の行にて下記エラーが発生致しました。
その行のどの部分に問題があるのかを確認してみてください。
NullReferenceException とは、インスタンスが空の時、すなわち オブジェクトが Nothing である場合に、 そのメンバーを操作しようとして発生する例外ですよね。
If doc Is Nothing Then MsgBox("doc が空だった") ElseIf doc.all Is Nothing Then MsgBox("doc.all が空だった") ElseIf doc.all.item("yahoo") Is Nothing Then MsgBox("doc.all.item(""yahoo"") が空だった") Else MsgBox("いずれも空ではなさそう") yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement) End If
> FindWindowExWの値は0ですが、FindWindowではハンドル値取得できました。 > PWnd1 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "TabThumbnailWindow", "JavaScript テスト - Internet Explorer")
示されているのが結果だけで、要因となりうる情報が隠されたままなので、修正すべき箇所を指摘できないです。(^^;
あえてもう一度質問させていただきます。 『その API (FindWindowEx および FindWindowExW) の宣言部はどうなっていますか?』( No90475 の再掲 )
少なくとも当方では、下記の API 宣言で取得できています。
' Imports System.Runtime.InteropServices
' === 案1 === <DllImport("user32", CharSet:=CharSet.Unicode, SetLastError:=True)> Private Shared Function FindWindowExW(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr End Function
' === 案2 === <DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True)> Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr End Function
' === 案3 === Private Declare Unicode Function FindWindowExW Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> lpszWindow As String) As IntPtr
' === 案4 === Private Declare Auto Function FindWindowEx Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> lpszWindow As String) As IntPtr
宣言が間違っていて、IntPtr.Zero が返却されてしまうパターン。
' === 没1 === <DllImport("user32", EntryPoint:="FindWindowExW", SetLastError:=True)> Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr End Function
' === 没2 === <DllImport("user32", SetLastError:=True)> Private Shared Function FindWindowExW(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr End Function
' === 没3 === Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExW" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
正しい宣言ではないが、一応呼び出せてしまうパターン。
' === 非推奨1 === Private Declare Unicode Function FindWindowExW Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
' === 非推奨2 === Private Declare Unicode Function FindWindowEx Lib "user32" Alias "FindWindowExW" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
> WEBページ・・・CreateObject("Shell.Application").Windowsで対応しております。 これを用いている部分のコードも見せていただけないでしょうか。
SHDocVw.ShellWindows を宣言しておきながら、FindWindowEx API や、GetIEDocument までも 追加で呼び出している理由が、どうしても分からなかったのです。
No90463 の発言より、「objIE.LocationName」を利用しているであろうことは推察できましたが、 目的は LocationName プロパティでウィンドウのタイトルを得ることだけなのでしょうか。 あるいは HWND プロパティからウィンドウハンドルも得ているとか?
objIE.Document プロパティを通じて HTMLDocument を得ることができるはずなので、 わざわざ GetIEDocument を呼び出す必要性は無いと思っています。( No90469 で指摘 )
(例) http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2007/02/shellhtmldocume_f1cd.html
WM_HTML_GETOBJECT でないと取得できない相手の場合は、API 宣言が必要になりますが、 その場合、今度は CreateObject("Shell.Application").Window を使う意味が分からない…。
> 上記WEBページから派生したWEBページダイアログ ・・・ GetIEDocument で対応(現在、ここのボタンクリックのイベントを対応しております。)
ここでいう『派生』とは何を示していますか? ページ遷移の事でしょうか?
ページが遷移したのであれば、以前の HTMLDocument はもう使えないので、 読み込みが完了したことを通知するための DocumentComplete イベントにて、 イベント引数 pDisp の Document プロパティを受け取るようにします。 (フレームを持つページの場合は、各フレームごとに発生することに注意)
あるいは、ターゲットとなる InternetExplorer オブジェクト(IWebBrowser2)を保持しておいて、 その Document プロパティを取得しなおすという方法も使えますが、いずれにせよ、 読み込みが完了する前に GetIEDocument なり Document プロパティなりで HTMLDocument を得ていた場合、DOM が不完全な状態になっていることがあります。
なので、取得した HTMLDocument が、目的のページの内容を指しているかを 確認しておくことも重要です。(これも No90469 で指摘 )
それに、FindWindowEx を使うにしても、その使い方が不自然に思えます。 そもそも "TabThumbnailWindow" クラスを探している理由は何でしょうか? 先の GetIEDocument を使うことが目的なら、探すべきウィンドウは "Internet Explorer_Server" クラスのウィンドウ(またはその親ウィンドウ)の ハンドルであるはずですよね。
また、「WEBページダイアログ」とは何を指していますか? キャプションが "JavaScript テスト - Internet Explorer" となる、 No90454 の https://www.javadrive.jp/javascript/event/sample2_1.html だとすれば、 そもそもダイアログは存在していません。 別のページが対象なのかもしれませんが、その場合は、doc.all.item("yahoo") は存在しないかもしれませんし。
No90476 では「javascriptによる擬似モーダルダイアログ『だと思う』」とお答えいただきましたが、 それが具体的になんであるのか(たとえば jQuery の colorbox とか)や、 イベント割り当てが onclick なのかそれ以外なのかもはっきりしないままです。 |