關鍵字:WebBrowser, WebBrowser_V1,NewWindow, NewWindow2, NewWindow3, INewWindowManager
你的機器上總是存在著“兩”個WebBrowser,一個叫WebBrowser,另一個叫WebBrowser_V1,其CLASSID如下:
CLASS_WebBrowser: TGUID = '{8856F961-340A-11D0-A96B-00C04FD705A2}';
CLASS_WebBrowser_V1: TGUID = '{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}';
它們分別對應的介面是IWebBrowser2和IWebBrowser。問題是我們該用哪一個呢?
按照微軟的推薦,應該盡量使用前者,因為後者是為相容Internet Explorer 3.x而保留的(儘管它能夠響應來自Internet Explorer 3.x、4.x、5.x、6.x的事件),相應的IWebBrowser和IWebBrowserApp介面也應拋棄。
由於Internet Explorer 3.x年代久遠,導致WebBrowser_V1提供的事件少得可憐,但值得一提的是它提供的兩個事件OnNewWindow和OnFrameBeforeNavigate有著與OnBeforeNavigate幾乎相同的參數:
OnBeforeNavigate(
BSTR URL,
long Flags,
BSTR TargetFrameName,
VARIANT* PostData,
BSTR Headers,
BOOL FAR* Cancel)
OnNewWindow(
BSTR URL,
long Flags,
BSTR TargetFrameName,
VARIANT* PostData,
BSTR Headers,
BOOL FAR* Processed)
OnFrameBeforeNavigate(
BSTR URL,
long Flags,
BSTR TargetFrameName,
VARIANT* PostData,
BSTR Headers,
BOOL FAR* Cancel)
所以使用WebBrowser_V1使得我們的瀏覽器在有新視窗開啟時能夠輕易捕捉到其URL及相關的資料,如果將Processed設定為TRUE,則可取消新視窗的彈出。同樣,處理Frame也比在WebBrowser中來得容易。
但WebBrowser_V1的致命弱點是它不支援進階介面,如IDocHostUIHandler,即便我們實現了IDocHostUIHandler介面,也不會被WebBrowser_V1調用。所以希望在自己的瀏覽器中實現XP的介面主題、擴充IE的DOM(Document Object Model)等進階控制的話,就肯定不能選擇WebBrowser_V1了。
處理新視窗實在是很麻煩的一件事,不知道微軟為什麼在新版本的OnNewWindow2事件中去掉了URL這樣的參數,而且OnNewWindow2事件不能完全捕捉到所有的新視窗開啟。但如果安裝了Windows XP SP2的話,好處又回來了。
Windows XP SP2對Internet Explorer 6作了升級,並且提供了一個新的事件OnNewWindow3,它在OnNewWindow2事件之前發生,也包含了讓我們能夠加以過濾處理的新視窗的URL等參數,再加上INewWindowManager介面,就是實現Windows XP SP2中過濾廣告視窗功能的基礎。
參考資料:
MSDN:185538 HOWTO: Cause Navigation to Occur in Same WebBrowser Window
引用地址:Internet Explorer 編程簡述(一)WebBrowser還是WebBrowser_V1