VBScritpですでに起動しているInternet ExplorerにConnectObjectを設定し、イベントの取得をできるようにしたいのです。
しかし少し調べるとWSHのバグでIEには接続できないようなのです。
何か代替の方法はないものでしょうか?
よろしくお願いします。
>しかし少し調べるとWSHのバグでIEには接続できないようなのです。
根拠になるソースはありますか?
実際コードを書いて試しましたか?
>根拠になるソースはありますか?
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list157.shtml
2006年 06月 03日 06時 18分 16秒 の記事
http://hyons.hp.infoseek.co.jp/scr/scr001.shtml
>実際コードを書いて試しましたか?
試しました。
他のオブジェクトには接続できるのに、IEの場合だけ「接続できません」とエラーがでます。
失敗するというソースは出せないの?
>失敗するというソースは出せないの?
なぜ失敗するかとかは聞いてませんよ、代替の方法があるかを質問しているんです。
某掲示板からの流用ですが、一応コード張っておきます。
Set Shell = CreateObject("Shell.Application")
Set ies = Shell.Windows
Found = False
For Each ie In ies
If TypeName(ie.Document) = "HTMLDocument" Then
Found = True
WScript.ConnectObject ie, "ie_"
Exit For
End If
Next
If Not Found Then
WScript.Quit
End If
ie_OnQuitCalled = False
Do While True
WScript.Sleep 100
If ie_OnQuitCalled Then
WScript.Quit
End If
Loop
Function ie_OnQuit
MsgBox "ie_OnQuit"
ie_OnQuitCalled = True
End Function
なぜ失敗するのか、は、IProvideClassInfoを備えていないから、
だったと思います。
で、あんさんの言ってることは、再現できるコードを提示してくれ、
ということであって、「なぜ」を尋ねてはいないでしょう。
で、VBScript単体じゃ難しいのではないか、とは思います。
代わりに同様の作業をしてくれるオブジェクトも一般的には
見当たらないようですし。
もちろん、そういう作業をするオブジェクトを独自に作る、という
手はありますが、それはVBScript以外の多言語で行うものでしょうし。
>なぜ失敗するのか、は、IProvideClassInfoを備えていないから、
だったと思います。
で、あんさんの言ってることは、再現できるコードを提示してくれ、
ということであって、「なぜ」を尋ねてはいないでしょう。
そうですね、でも質問はあくまでも代替方法があるか?
ですから再現するソースを提示する必要はないですよね。
>で、VBScript単体じゃ難しいのではないか、とは思います。
はい、難しいと思います。
でも前にとあるサイトでVBScriptで実行できたという話を読んだので、おそらく方法はあると思います。
ただ残念ながらそのサイトがすでに消えてしまっているんです。
提示された掲示板の内容を読む限りは、ラッピングするクラスである
"WrapWithClassInfo"は他の言語で作られているように読めますが、
どうなんでしょうね。作成者のAKAさんが他に作ったものには
"WSH互換スクリプトホスト"もありますが、これはスクリプトで作った
とは考えにくいですし。
で、再現するソースが提示されないと、ほとんどの人は関わる気には
ならないでしょう。また、意味の取り違えを防ぐ、という意味合いも
ありますし。
IProvideClassInfo という話は、私の専門外なので、よくわかりませんが、
VBScript から IE を制御するときって、
> ConnectObject
を使ってイベント割り当てをするのではなく、
CreateObject の第二引数を使って制御する必要がありますよね。
ですから、そのままでは無理な気がします。
> 何か代替の方法はないものでしょうか?
監視対象が OnQuit イベントだけなら、WMI の Win32_Process クラスで
代替してみては如何でしょう。
>魔界の仮面弁士 2007/09/11(火) 17:11:11 <常連>
>> ConnectObject
>を使ってイベント割り当てをするのではなく、
>CreateObject の第二引数を使って制御する必要がありますよね。
なので、ConnectObjectするのでなく、
CreateObjectしたieに元のieの情報をセットして、元のieを消すとか?
>監視対象が OnQuit イベントだけなら、WMI の Win32_Process クラスで
>代替してみては如何でしょう。
ieの終了でプロセスが終了するとは限らないので、
TypeName(ie)の変化を監視でしょうね。
いずれにせよ、ieのeventはVBScriptでByRef引数の設定ができないなど
無理があるので、いろいろやるならVBでしょう。
ちなみに、元に質問された場所では、既に回答が出ています。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/index.shtml
で、それはそれとして、IEのイベント関連の話ですが、VBでも
捕らえきれないものがあったような。NewWindow3やWindowStateChanged
イベントは取り扱えませんよね。こういう点ではむしろVBScriptのが
有利かも。
皆様ありがとうございました。
他掲示板で教えてもらったのですが、
GetRef関数を使用することで、IE内部のhmlイベントにはConnectできました。
ツイート | ![]() |