ある状況下で、ShellからInternetExplorerオブジェクトを取得できないのに、
IEのウインドウは存在するという状態があり、
この"IFrame"や"TabWindowClass"のhWndからInternetExplorerオブジェクトを取得したいと考えています。
hWndを元にしてInternetExplorerオブジェクトを生成することは可能でしょうか?
またhWndからではなくとも、InternetExplorerオブジェクトが得られるなら何でもかまいません。
いくつか手段があるようでしたらそれらもお教え頂けたら幸いです。
(後述しますが、実際Shellオブジェクトからでは取得不可能でした)
想定状況はかなり特殊で「explorer.exeが一度強制終了された後」というものです。
この状況下においてIEを取得したいのですが・・・どうしたものかと考えあぐねています。
状況の再現は、タスクマネージャから強制的にexplorer.exeを落とし、
同じくタスクマネージャから再びexplorerを一度呼び出すことで再現できるようです。
(XPではexplorerが強制終了された場合、多くの場合新たなexplorer.exeが起動し自動的に復旧します)
この条件下では、まずShellからでは正しく情報が取得できませんでした。
この条件下に入ってから新たに起動されたIEであればそのすべてを取得できるのですが、
以前のexplore.exeの際にすでに作成されていたIEウインドウに関してはひとつも列挙されませんでした。
このため現在は他の方向、EnumWindowsやEnumChildWindowsからアプローチできないか試行錯誤している最中です。
IEFrameとTabWindowsClassのウインドウハンドルが取得出来る所までしか至っていません。
(その配下にあると思われるShell DocObject ViewとInternet Explorer_ServerのhWndはまだ取得できていませんが、
得られないのは私の知識不足が原因でおそらく適切なAPIを用いれば取得可能であろうと考えています)
仮にInternetExprorerオブジェクトが取れなくとも、最悪でも現在開いているURLが取得できればいいのですが・・・。
テストしている環境はXPSP3です。
いろいろとおかしな条件を付けて申し訳ありません。
Windowsの仕組みに理解が足りないためご迷惑をおかけするかと思いますが、どうかよろしくお願いします。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200810/08100020.txt
参考になりませんか?
以上。
レスありがとうございます。
>参考になりませんか?
一応全文とリンク先を読んで参りましたが、
「起動されているIEを取得する話」ではなく「新規起動の話」に終始しているようでした。
また手がかりとなりそうな手法も残念ながら見当たりませんでした。
些細な追加情報なのですが、前述していた"Shell DocObject View"と"Internet Explorer_Server"について
hWndを取得する事が出来ました。EnumChildWindowsで普通に取得出来ました。
(単にコードの誤りで、わざわざ見つけていたものを弾いていただけでしたorz)
また念のため「望む結果が得られないコード」を書いておきます。
Dim Obj As Object
Dim ColIEList As New Collection
For Each Obj In CreateObject("Shell.Application").Windows
If TypeName(Obj.Document) = "HTMLDocument" Then
ColIEList.Add Obj
End If
Next
このコードでは、explorerの強制終了前に開かれたIEを補足出来ません。
よろしくお願いします。
> この"IFrame"や"TabWindowClass"のhWndからInternetExplorerオブジェクトを取得したいと考えています。
『Internet Explorer_Server』のハンドルからで良ければ、
以下のようにして取得できます。
Public Function GetWebBrowser2(ByVal hWnd As Long) As SHDocVw.IWebBrowser2
Dim document As HTMLDocument
Dim pUnk As olelib.IUnknown
Dim IID_IServiceProvider As UUID
CLSIDFromString "{6D5140C1-7436-11CE-8034-00AA006009FA}", IID_IServiceProvider
Dim IID_IWebBrowser2 As UUID
CLSIDFromString "{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}", IID_IWebBrowser2
Dim SID_SWebBrowserApp As UUID
CLSIDFromString SIDSTR_SWebBrowserApp, SID_SWebBrowserApp
Dim dom As MSHTML.IHTMLDocument
Set dom = WindowDOM(hWnd)
Set pUnk = dom.parentWindow
Dim pService As IServiceProvider
pUnk.QueryInterface IID_IServiceProvider, pService
pService.QueryService SID_SWebBrowserApp, IID_IWebBrowser2, GetWebBrowser2
End Function
上記の WindowDOM 関数は、下記のサンプルにある物を利用しています。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200904/09040020.txt
また、参照設定として、
Microsoft Internet Controls (SHDOCVW.DLL)
Microsoft HTML Object Library (MSHTML.TLB)
Edanmo's OLE interfaces & functions v1.81 (OLELIB.TLB)
を加えています。OLELIB.TLB は、下記のライブラリです。
http://www.mvps.org/emorcillo/en/code/vb6/index.shtml
レスありがとうございます。
>『Internet Explorer_Server』のハンドルからで良ければ 取得できます。
うわ、すごい答えが・・・!w
これは、クラス定義から含めてオブジェクトを自力で作っている・・・という事でしょうか?
正直コード自体の意味がさっぱり解りませんが、手が空き次第試して報告したいと思います。
レスが大変遅くなり申し訳ありません。
(メンテ中だったためか、何度書き込んでもレスが出来ませんでした)
提示して頂いた方法で例の限定条件下でも補足できる事を確認しました。
とても参考になりました、本当にありがとうございました。
(遅まきながら解決チェックを付けさせて頂きました)
稚拙ながら出来上がったコードを提示したいと考えましたが、エラー処理やら判定処理をふんだんに盛り込んで長大なってしまったので控えさせて頂こうと思います。
ツイート | ![]() |