Shdocvw Webbrowserコントロールから「最高レベルのフレーム」を取得する
-
28-10-2019 - |
質問
のドキュメント documentcomplete イベントは終わり近くに言及しています:
ローディングプロセスでは、必ずしもトップレベルのフレームではない最高レベルのフレームが、最終的なdwebbrowserevents2 :: documentcompleteイベントを発射します。この時点で、PDISPパラメーターは、最高レベルのフレームのIDISPATCHインターフェイスポインターと同じです。
最高レベルのフレームとトップレベルのフレームの違いは何ですか?また、最高レベルのフレームへの参照を取得するにはどうすればよいですか?
解決
上部にバナーフレーム、左側のメニューフレーム、右側にコンテンツフレームが含まれるトップレベルのフレームセットがあるWebサイトがあると仮定します。メニューフレームの各アンカー要素には、コンテンツフレームに設定されたターゲット属性があります。各コンテンツページには、メニュー項目のターゲットページになるIFRAMEがいくつかあります。
次に、左側のメニューリンクをクリックします。フレームセット自体は変更されず、メニューフレームも変更されません。ナビゲートしている唯一のフレームは、ナビゲーションで最高レベルのフレームであるコンテンツフレームです。
最初のnavigatecomplete2イベントのパラメーターから、最高レベルのナビゲートフレームの参照を取得できます。 IEは、コンテンツページのフレームを解析して、ロードする追加のフレームがあるかどうかを確認します。コンテンツページの残りのIFRAMEがロードされ、最後にDocumentComplete2イベントがコンテンツフレーム用に発生すると、追加のNavigateComplete2およびDocumentComplete2イベントが発生しました。
他のヒント
これを行って、ドキュメントが本当にロードされているかどうかを確認するためにテストしている場合、この特定のイベント(つまり、PDISPオブジェクト)をテストするより良い方法があります。私のWebbrowser-Control関連の回答のいくつかを見てください。
したがって、ここでは、NavCompleteとdoccCompleteの間の違いのカウンターを実行したいのですが、普通に行うと、NavCompleteが多くのフレームで複数回呼び出されるため、機能しないため、NavCompleteが確認するには確認する必要があります。呼ばれることはユニークなものです。 VBでは、ISオペレーターを使用してあるオブジェクトを別のオブジェクトと比較するだけで、C#では私が理解していないので、通常のオブジェクトの比較を行うだけです。
したがって、NavCompleteが投稿したすべてのPDISPオブジェクトのリストを保持し、それぞれを追加する前に、コレクション全体をチェックして、追加されているPDISPが以前に追加されていないことを確認します(つまり、ユニークです)。 If pDisp Is pDispCollection(i) Then
そして、「私」は、ループごとにあなたのインクリメントカウンターです。
さて、docccompleteの投稿は常に一意であるというpdisp(したがって、新しい/unique pdispごとに複数回呼び出すことを心配する必要はありません)したがって、pdispが発生するたびに、コレクションからどれがコレクションであるかを見つけるだけです。削除します。
0になると、本当に終了したことがわかります:)。
テストする必要があることは他にもありますが、これは大きな/主な重要なものであり、正確な時間を大きくします(.busyと.readystateをチェックするだけではありません)。
それがどうなるか、またはもっと助けが必要かどうか教えてください。