IE裡的探索之定製瀏覽器好助手

2021-06-07 02:58:26 字數 3398 閱讀 5843

訪問文件物件

現在 bho 引用了 internet explorer 的 webbrowser 控制項並已經連線到瀏覽器 以接收它產生的事件。在 web 頁面被完全

並被正確地初始化之後,現在終於可以通過 dhtml 文件物件模型訪問它了。webbrowser 的 document 屬性返回乙個指向文件物件的 idispatch 介面的指標:

ccomptrpdisp;

hresult hr = m_spwebbrowser2->get_document(&pdisp);

get_document() 方法提供的只是乙個指向介面的指標。我們需要確定在 idispatch 指標後面確實是乙個 html 文件物件。如果使用 visual basic,以下是等價的**:

dim doc as object

set doc = webbrowser1.document

if typename(doc)="htmldocument" then

@# get the document content and display

else

@# disable the display dialog

end if

現在我們需要判斷 get_document() 返回的 idispatch 指標的實質。internet explorer 不僅是乙個 html 瀏覽器,還能處理任何 activex 文件 ;即任何有作為 activex 文件服務程式的應用程式支援的文件。這樣一來,就不能保證檢視的文件的確是乙個 html 頁面。

有乙個解決辦法就是檢視 url 並檢查 url 的副檔名。但該如何處理 active server pages (asp) 或乙個暗含指向 html 頁面的 url?如果你使用了像 about 或 res 這樣的定製協議又該如何?

我們決定採取另一種方式,它和上面的 visual basic **性質相同。這種想法就是,如果 idispatch 指標確實指向乙個 html 文件,對 ihtmldocument2 介面的訪問就能成功地返回。ihtmldocument2 是綜合了 dhtml 物件模型為 html 頁面實現的所用功能的介面。以下**片斷說明如何進行這樣的判斷:

ccomptrpdisp;

hresult hr = m_spwebbrowser2->get_document(&pdisp);

ccomqiptrsphtml;

sphtml = pdisp;

if (sphtml)

else

如果訪問 ihtmldocument2 介面失敗,sphtml 指標為 null。否則,我們就可以正常訪問 dhtml 物件模型的方法和屬性了。

現在的問題是如何獲得已顯示的頁面的源**。幸好,基本的 dhtml知識就足以做到這一點。由於 html 頁面將它所有的內容包含在 標記中,dhtml 物件模型要求你首先獲得指向 body 物件的指標:

ccomptrm_pbody;

hr = sphtml->get_body(&m_pbody);

奇特的是,dhtml 物件模型不讓你知道在 之前的標記,例如 的原始內容。這些內容已經被處理並被儲存到一系列屬性中了,但你依然不能得到乙個最初的 html 檔案的原始內容。然而,現在 body 能告訴我們的就足夠了。我們需要將 outerhtml 屬性的內容讀取到乙個 bstr 變數裡以獲得包含在 和 之間的 html **。

bstr bstrhtmltext;

hr = m_pbody->get_outerhtml(&bstrhtmltext);

hresult cviewsource::getdocumentcontent()

else // 文件不是 html 頁面

return s_ok;

}管理**視窗

用以顯示當前頁面的 html 源**的**視窗是 atl 的另乙個基本元素,乙個可以在 atl 物件嚮導的 miscellaneous 頁裡找到的對話方塊視窗。我們重置這個視窗的尺寸以響應 wm_initdialog 訊息,並使此視窗佔據桌面工作區,即螢幕的可用部分減掉工作列可能佔據位置最下面的部分。

瀏覽器啟動時此視窗可能出現也可能不出現。預設情況下它是出現的,但可以通過清除核取方塊 show window at startup 禁止。如果你願意也可以關掉它。隨後,可以在任何時候按 f12 鍵將其召回。f12 由我們在 setsite() 中安裝的鍵盤掛鉤捕獲。

啟動設定完全按照 microsoft 指示儲存在登錄檔裡。讀寫登錄檔時我們沒有使用 win32 函式,而是使用了新的 shell lightweight api (shlwapi.dll),這樣 可以避免開啟和關閉相應的登錄檔項的麻煩:

dword dwtype, dwval;

dword dwsize = sizeof(dword);

shgetvalue(hkey_current_user, _t("software\\msdn\\bho"),

_t("showwindowatstartup"), &dwtype, &dwval, &dwsize);

這個 dll 是在 internet explorer 4.0 和 active desktop 中引入的,從 windows 98 開始成為標準的系統元件。這些函式比相應的 win32 函式更直接,適合只進行一次讀寫時使用。

註冊助手物件

bho 是 com 服務程式,應該同時以 com 服務程式和 bho 註冊。atl 模板為你提供了完成第一項註冊的註冊指令碼** (rgs) 。以下是完成 bho 註冊的 rgs **。(clsid 是從例程式中得到的。)

hklm

}}}}}}}

注意 forceremove 子句使鍵在物件取消註冊時被刪除。

在 browser helper objects 鍵下是所有安裝的助手物件。瀏覽器從不將這些放入快取,所以安裝並測試bho 是乙個很快的過程。

bho小結

本文中,我們介紹了瀏覽器助手物件,一種相對來說比較新的、在瀏覽器的位址空間內直接引入你的**的有效方式。你所要做的就是編寫乙個 com 服務程式以支援 iobjectwithsite 介面。這裡,你的模組從所有預定目的來看都是瀏覽器機構中的乙個元件。本文中我們建立的例程式還涉及到如 com 事件、動態 html 物件模型以及 webbrowser 程式設計介面等內容。我們認為它演示了 bho 的功能,同時提供了乙個建立你自己物件的實用平台。如果你需要知道瀏覽器正在顯示什麼,你一定需要熟悉事件並進一步了解 webbrowser。現在你知道:預先警告是為了早做準備。作為結語,我們提醒你 bho 對 windows explorer 非常有用,而且,通過 webbrowser,它能由你的**驅動。

探索IE瀏覽器視窗

探索ie瀏覽器視窗點燃靈感 星之海洋 不知大家是否見過瀏覽器視窗 哎呦,不要打我!其實,不要小瞧了這普普通通的windows,除了常用的window.open 與window.resizeto 方法來開啟視窗外,仔細挖掘,你還能找到許多奧秘在裡頭,下面就跟著我一起來探索探索吧 let s go!一 ...

探索IE瀏覽器視窗

探索ie瀏覽器視窗點燃靈感 星之海洋 不知大家是否見過瀏覽器視窗 哎呦,不要打我!其實,不要小瞧了這普普通通的windows,除了常用的window.open 與window.resizeto 方法來開啟視窗外,仔細挖掘,你還能找到許多奧秘在裡頭,下面就跟著我一起來探索探索吧 let s go!一 ...

探索IE瀏覽器視窗

探索ie瀏覽器視窗點燃靈感 星之海洋 不知大家是否見過瀏覽器視窗 哎呦,不要打我!其實,不要小瞧了這普普通通的windows,除了常用的window.open 與window.resizeto 方法來開啟視窗外,仔細挖掘,你還能找到許多奧秘在裡頭,下面就跟著我一起來探索探索吧 let s go!一 ...