3

残念ながら、私は Internet Explorer の BHO を作成するのに行き詰まっています。その機能は、ユーザーがアクセスするすべての Web ページに iframe を挿入し、ユーザーがビジネスを行っているときに (比較的) 一定の情報を表示することです。次のように、かなりハックな一連の mshtml キャストを介してインジェクションを管理しました。ここで、Explorer は WebBrowserClass オブジェクトであり、foo.html は BHO のソースと共に提供されます。

IHTMLDocument2 document = (IHTMLDocument2) Explorer.Document;
IHTMLDocument3 doc3 = (IHTMLDocument3)document;
var iframe = document.createElement("iframe");
iframe.setAttribute("src", "foo.html");
iframe.setAttribute("id", "iFrame");
iframe.setAttribute("style", "position: fixed; left: 0px; top: 0px; border: 0px; width: 100%; height: 45px; background-color: white");
IHTMLElementCollection iec = doc3.getElementsByTagName("body");
IHTMLElement elem = (IHTMLElement)iec.item(0);
IHTMLDOMNode domnode = (IHTMLDOMNode)elem;
domnode.appendChild((IHTMLDOMNode)iframe);

これはうまくいきます!おもう。並べ替え。OnDocumentComplete に貼り付けると無限ループが発生し、どちらの方法でも iframe が表示されません。ループの問題は、OnDocumentComplete のような Explorer のイベント リスナーを使用していることです。これは、iFrame 内のページの読み込みが完了するたびに呼び出され、インジェクション関数が呼び出され、次に OnDocumentComplete が呼び出されるためです。OnNavigateComplete を使用してみましたが、複数のソースから読み込まれているページ (たとえば、オートコンプリートが有効になっている Google のメイン検索ページなど) で複数回読み込まれます。ただし、無限ループに入らない場合でも、私はまだ目に見える iframe になっていません。

したがって、これは 2 つの質問だと思います。1) 実際に iframe を表示するにはどうすればよいですか? インジェクション コードは機能します (簡単な JavaScript アラートで試してみました)...無限ループ?

その他の潜在的に関連する機能:

void OnNavigateComplete(object pDisp, ref object URL)
{
  if ((_currentDocument != null) && (isValidURL(_currentDocument.url))) 
  {
      injectFrame();
  }
}

void OnDocumentComplete(object pDisp, ref object URL)
{
    if (Explorer.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
    {
        _currentDocument = Explorer.Document as mshtml.HTMLDocument;
        if (_currentDocument != null)
        {
            //injectFrame();
        }
    }
}
4

1 に答える 1

2

さて、私はほとんどこれを理解したと思います。OnDocumentCompleteはまだ複数回呼び出されていますが、フレームに関するすべての問題を検討しました...したがって、iframeが複数回読み込まれている間、同じ場所に読み込まれます。

無限ループの修正は、ツールバーの場所をハードコーディングし、OnDocumentCompleteでそのURLを確認することでした。

void OnDocumentComplete(object pDisp, ref object URL)
{
  // _currentDocument = Explorer.Document as mshtml.HTMLDocumentClass;
    if (Explorer.ReadyState == SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
    {
        _currentDocument = Explorer.Document as mshtml.HTMLDocument;
        if (_currentDocument != null)
        {
            // we have a document - attach our events
            // on onload event should go here if the document is now complete...
            if (!URL.Equals("http://url.to/foo.html")) injectFrame();
        }
        else
        {
            // document is null?
            // Debugger.ShowMessage("Tried to attach to document, but was null");
        }
    }
}

iframeに関する限り、Style属性は、他のすべての属性のような通常の文字列ではなく、明らかに独自の文字列のセットです。だから、次のようなことをする代わりに...

setAttribute("style","position: fixed; left: 0px; top: 0px; border: 0px; width: 100%; height: 45px; background-color: white");

私はしなければならなくなった

iframe.style.setAttribute("position", "fixed");
iframe.style.left="0px";
iframe.style.top="0px";
iframe.style.border="0px";
iframe.style.width = "100%";
iframe.style.height="45px";
iframe.style.backgroundColor="white";

このすべてが大きな頭痛の種であり、二度と対処する必要がないことを願っています。

于 2012-05-06T14:10:13.043 に答える