投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/6/15 12:29:57
> あまりにも過大な情報だった
過大…でしたかね。ごめんなさい。

# 思いつく範囲で、できるかぎり単純な方法を模索したつもりだったのですが…。


> webbrowser1.docmentと
> webbrowser1.A
> というオブジェクトがあるのでしょうか?
実際、そのようなコードを書いてもエラーになってしまいますよね。

WebBrowser.Document から返される「document オブジェクト」は、
HTML を JavaScript から制御するときに使う document オブジェクトと同一です。

(WebBrowser.Document を扱う際には、DHTML の操作方法がそのまま使えますので、、
「DHTML」に関する基礎知識を身につけておくと、役に立ちますよ)


そして A オブジェクトは、<A> タグを表すオブジェクトです。

目的のタグを取得する方法は幾通りもありますが、たとえば、
getElementsByTagName を使って、目的のタグを得る方法があります。

Dim doc As MSHTML.HTMLDocument
Set doc = WebBrowser1.Document

Dim tags As MSHTML.IHTMLElementCollection
Set tags = doc.getElementsByTagName("A")   '<A>タグの一覧を取得 

If tags.length > 0 Then   '<A>タグが見つかった場合 
    Dim a As MSHTML.HTMLAnchorElement
    Set a = tags(0)       '最初の(0番目の)<A>タグを取得する 
    Debug.Print a.outerHTML    '確認用 
End If


このコードを実行する場合には、先に紹介した
>> http://support.microsoft.com/kb/246247/ja
に書かれているように、参照設定に『Microsoft HTML Object Library』を
加えておいてください。(参照設定せずに、As Object な変数で受けても呼べますが、
慣れないうちは、参照設定を行った方が分かりやすいかと思います。)


> 私は<A Herf>のリンクが押されれば良いと思っているのですが、
その場合、リンクを押すのは誰でしょうか?

ユーザーが押すのであれば、プログラム側からは特に何もする必要はありませんが、
プログラムから自動的に、リンクを押したことにしたいのであれば、
 (1) 複数ある A タグのうち、どれを対象にするのかを決める。
 (2) 対象となる A オブジェクトの click メソッドを呼び出す。
といった手順になるかと思います。


> JavascriptやFlashのリンクに対応させるならば
> BeforeNavigate2を使うという事なのでしょうか?

BeforeNavigate2 は、ページが遷移する直前に発生するイベントです。
これを使えば、どの URL にジャンプしようとしているのかを把握できます。


> ちなみにDocumentのOnClickイベントだとページをどこでも押すたびに
> メッセージボックスが流れるので想定した仕様に合っていません。
Document.OnClick 内で、「今押されたのがリンクかどうか」を調べるという
実装手法もあるにはありますが、先の回答にて
>>> 上記では document オブジェクトの onclick をとらえていますが、A オブジェクトの場合にも応用できるはずです。
と書いたように、「(document ではなく)A の onclick イベント」を使うこともできます。

A の onclick イベントを拾う場合には、イベント変数宣言を
Private WithEvents doc As HTMLDocument
Private WithEvents a As HTMLAnchorElement
のようにし、この変数 a に、操作対象の A オブジェクトを Set すれば OK です。


ただし、取得対象の A タグが複数あった場合には、onclick を拾う方法だと
管理が大変だと思います。なので、BeforeNavigate2 を使った方法の方が楽でしょう。


> JavascriptやFlashのリンクに対応させるならば
ちなみに、<A> タグは「HTML」の一部であり、これは DHTML で制御できる範囲ですが、
<OBJECT> タグなどで埋め込まれた ActiveX コンテンツ内の要素は、アドインによって
処理されています。そのため、DHTML からは直接制御できません。

Flash 内のリンクであれば、Flash Player 経由での操作となりますし、
PDF 内のリンクであれば、Adobe Reader 経由での操作となりますし、
自作の ActiveX Document であれば、そのコンポーネント経由での操作となります。

そして、これらのコンテンツ内のリンクをプログラムから制御できるかどうかは
それぞれの ActiveX コンポーネントによって異なります。


Option Explicit

Private Sub Form_Load()
    WebBrowser1.Navigate "http://www.adobe.com/jp/products/flashplayer/"
End Sub

Private Sub Command1_Click()
    Dim doc As MSHTML.HTMLDocument
    Set doc = WebBrowser1.Document
    
    Dim obj As MSHTML.HTMLObjectElement
    Set obj = doc.getElementById("flashplayer-marquee")
    Debug.Print obj.outerHTML
    Debug.Print TypeName(obj.object)

    'ここから先は、Flash のコンポーネントに対する操作 

    '下記の変数宣言のために、[Flash10b.ocx] を参照設定する必要があります 
    'Dim swf As ShockwaveFlashObjects.ShockwaveFlash 
    'Set swf = obj.object 
    'Debug.Print swf.IsPlaying()     '再生中か否か 
    'Debug.Print swf.TotalFrames     '動画の総フレーム数 
    
End Sub