DocumentCompleteイベントのドキュメントでは、最後に次のように言及されています。
ロード プロセスでは、必ずしも最上位のフレームではない最上位のフレームが、最終的な DWebBrowserEvents2::DocumentComplete イベントを発生させます。このとき、pDisp パラメータは、最上位フレームの IDispatch インターフェイス ポインタと同じです。
最上位フレームと最上位フレームの違いと、最上位フレームへの参照を取得するにはどうすればよいですか?
DocumentCompleteイベントのドキュメントでは、最後に次のように言及されています。
ロード プロセスでは、必ずしも最上位のフレームではない最上位のフレームが、最終的な DWebBrowserEvents2::DocumentComplete イベントを発生させます。このとき、pDisp パラメータは、最上位フレームの IDispatch インターフェイス ポインタと同じです。
最上位フレームと最上位フレームの違いと、最上位フレームへの参照を取得するにはどうすればよいですか?
上部にバナー フレーム、左側にメニュー フレーム、右側にコンテンツ フレームを含むトップレベル フレーム セットを持つ Web サイトがあるとします。メニュー フレームの各アンカー要素には、コンテンツ フレームに設定された target 属性があります。各コンテンツ ページには、メニュー アイテムのターゲット ページとなる iframe がいくつかあります。
ここで、左側のメニュー リンクをクリックします。フレーム セット自体は変更されず、メニュー フレームも変更されません。ナビゲートしている唯一のフレームは、ナビゲーションの最上位フレームであるコンテンツ フレームです。
最初の NavigateComplete2 イベントのパラメーターから、最上位のナビゲーション フレームの参照を取得できます。次に、IE はコンテンツ ページのフレームを解析して、ロードする追加のフレームがあるかどうかを確認します。コンテンツ ページの残りの iframe が読み込まれると、追加の NavigateComplete2 および DocumentComplete2 イベントが発生し、最後にコンテンツ フレームに対して DocumentComplete2 イベントが発生します。
ドキュメントが本当にロードされたかどうかをテストするためにこれを行っている場合、この特定のイベント (つまり、pDisp オブジェクト) をテストするためのより良い方法があります。私の webbrowser-control 関連の回答のいくつかを見てください。
ここでは、NavComplete と DocComplete の差分カウンターを実行したいのですが、NavComplete が多くのフレームで複数回呼び出されるため、正常に実行すると機能しません。そのため、NavComplete が呼び出されるのはユニークなものです。vb では Is 演算子を使用してあるオブジェクトを別のオブジェクトと比較するだけですが、C# では Is が使用できないことを理解しているため、通常のオブジェクト比較を行うだけです。
したがって、NavComplete が投稿したすべての pDisp オブジェクトのリストを保持し、それぞれを追加する前に、コレクション全体をチェックして、追加される pDisp が以前に追加されていない (つまり、一意である) ことを確認しますIf pDisp Is pDispCollection(i) Then
。 i" は for each ループのインクリメント カウンターです。
現在、DocComplete が投稿する pDisp は常に一意であるため (したがって、新しい/一意の pDisp ごとに複数回呼び出されることを心配する必要はありません)、pDisp が発生するたびに、それがコレクションからどれであるかを見つけるだけです。そしてそれを取り除きます。
0 になったら、本当に終了したことがわかります :)。
テストする必要があるものは他にもありますが、これは非常に重要であり、正確性を大幅に向上させます (単に .busy と .readystate をチェックするだけではありません)。
それがどうなるか、またはさらに助けが必要な場合はお知らせください。