天天看點

如何對webbrowser和IE程式設計(三)

IWebBrowserApp

IWebBrowserApp 接口僅僅在IE中實作。 典型的,你使用InternetExplorer 對象建立一個IE的執行個體. 然後你使用 IWebBrowserApp 接口操縱此執行個體. (今天采用IWebBrowser2 替代) IWebBrowserApp 接口繼承自 IWebBrowser, 是以它提供 IWebBrowser 的全部功能。

因為IWebBrowserApp呈現一個IE視窗的執行個體, 是以它的方法和屬性典型地允許你控制浏覽器視窗的使用者接口。 這些方法和屬性并非包含在WebBrowser的 IWebBrowser 中的:寄宿control的應用程式提供諸如狀态條, 工具條, 以及菜單條等使用者接口. WebBrowser 控件僅僅用于裝載web頁以及其它類型檔案。

IWebBrowserApp 有4個方法和10 各屬性。

方法

IWebBrowserApp 接口的屬性很直覺立如下表, 但是有2個有理由值的讨論:GetProperty 和 PutProperty. 此兩個方法允許你在IE屬性包(property bag)中存儲一個屬性一邊你能夠在其後重新找回他們。 你将典型地從一個web頁上存儲一些狀态資訊到另一個web頁 (事實上,使用IWebBrowser2 接口你可以在宿主一個WebBrowser 控件時候使用此方法)

Table 6-3.

IWebBrowserApp  vtable 次序的方法

方法 描述
Quit 促使 Internet Explorer 視窗關閉。換句話講,将自動化操作關閉IE執行個體
ClientToWindow 轉換一個點從視窗坐标到客戶坐标。
PutProperty 存儲一個屬性值到ie的屬性包,将可以随手采用GetProperty.擷取
GetProperty 擷取先前由 PutProperty.方法存儲的屬性值

VB代碼:

InternetExplorer1.PutProperty "CurrentPicture", 10      
InternetExplorer1.GetProperty("CurrentPicture")      

VC++代碼:

CSomeClass::PutGetProperty(VARIANT vtCurrentValue, VARIANT* vtNewValue)      
{      
   HRESULT hr;      
   hr = m_pInternetExplorer->PutProperty(L"CurrentPicture",      
                               vtCurrentValue);      
   if (SUCCEEDED(hr))      
   {      
     // Notice that vtNewValue is already a pointer, so you      
     // don't have to pass the address to GetProperty.      
     //      
     hr = m_pInternetExplorer->GetProperty(L"CurrentPicture",       
                                 vtNewValue);      
   }      
   return hr;      
}      

PutGetProperty 方法接受包含目前屬性值的 VARIANT 變量指針且将接收屬性值。

屬性

IWebBrowserApp 接口有10 個屬性.

Table 6-4.

IWebBrowserApp vtable 次序的屬性

屬性 描述
Name 傳回對象的名稱t. (舉例,當自動化IE, Name 屬性将傳回 Microsoft Internet Explorer.)
HWND 傳回IE視窗的句柄
FullName 傳回ie可執行檔案的全路徑 (iexplore.exe).
Path 傳回IE應用程式的全路徑.
Visible 監測和設定IE視窗是否可見。 (換句話講,你可與使用此屬性顯示/隐藏)
StatusBar 顯示或者隐藏IE狀态條,也可監測目前狀态條
StatusText 設定或隐藏狀态條文字
ToolBar 顯示或者隐藏IE工具條,也可監測目前工具條狀态 
MenuBar 顯示或者隐藏IE菜單條,也可監測目前工具菜單态 
FullScreen 設定或者檢測一個值訓示IE目前是否最大化顯示。最大化顯示,iE占據整個螢幕

Table 6-4 中的屬性清單直截了當且易于使用。舉例來說, 如果你想從你的Vb程式中擷取IE狀态條中的文字,你應當使用如下代碼:

Dim strStatusText      
strStatusText = InternetExplorer1.StatusText      

使用MFC包裝類的VC++程式代碼如下:

BSTR bstrStatusText;      
HRESULT hr = m_pInternetExplorer->get_StatusText(&bstrStatusText);      

IWebBrowser2

因為COM規則要求接口恒久不變, 要加入新的工呢高COM,你必須增加新的接口。 新的接口可擴充自其他接口已擴充功能。 舉例,當心的需求引入WebBrowser 和Internet Explorer 接口, 開發者被要求建立一個新的接口: IWebBrowser2.

早期, IWebBrowser2 繼承自 IWebBrowser 和 IWebBrowserApp, 還提供不包含在着兩個接口中的功能. 是以你應當使用 IWebBrowser2 接口替代 來操縱WebBrowser 控件或者 Internet Explorer.

IWebBrowser2 接口有4個方法和8個屬性.

方法

  IWebBrowser2 接口方法如下描述,按照 vtable 次序, in Table 6-5.

也許IWebBrowser2 、接口踵使用最多的方法是ExecWB. 它通過WebBrowser實作了一個  IOleCommandTarget 接口的Exec的包裝實作。 在 ExecWB 方法 被建立前, 你不可以直接從VB中調用IOleCommandTarget::Exec, 因為VB不可通路 IOleCommandTarget 接口 ,因而VB不可直接使用該接口的ExecWB方法。 IOleCommandTarget::Exec 方法過去大量使用,是以 WebBrowser 開發者決定建立ExecWB 以使事情變得容易。

Table 6-5.

IWebBrowser2  Vtable 次序的方法

方法 描述
Navigate2 功能基于Navigate 方法,不同在于 Navigate2 允許你導航到飛URL表達的地方,例如Windows shell folder. (Windows shell folder 是指向标示符指針, 或者windows shell命名空間中的 PIDL,)
QueryStatusWB IoleCommandTarget接口的QueryStatus方法在 WebBrowser.中的包裝實作
ExecWB IoleCommandTarget接口的Exec方法在 WebBrowser.中的包裝實作
ShowBrowserBar 顯示或者隐藏特定的浏覽器條. 該方法僅僅用于InternetExplorer 對象

為什麼你無論如何都要調用ExecWB方法?因為它提供了你需要的功能(通過IOleCommandTarget::Exec)不是暴露于webbrowser接口。你大概疑惑于為社麼開發者不實作擴充屬性和方法。記住:COM規則是一旦接口發表就不可改變。是以你不能夠不能增加功能而不建立新的接口。

ExecWB 方法允許WebBrowser 開發者增加新的功能而不用建立新的接口。再之, 那是由WebBrowser 通過 ExecWB 代表性的暴露不常用的工的途徑, 譬如調用 Save As 對話框或者縮放web頁的字型。  ExecWB 工作的方法是傳遞一個你想調用的command ID 和必需的參數. 太多的 command IDs ,他們包含于OLECMDID 實作文檔頭檔案he DocObj.h .

作為舉例, 支援縮放web頁的内容字型。Internet Explorer 允許你通過View菜單的Text Size子菜單改變字型的大小從最小到最大。 ExecWB 方法暴露了允許你改變顯示在浏覽器中的文字大小。對于Zoom 指令, 你可指定特殊值0, 1, 2, 3, or 4,  0 是最小字型 ,4是最大字型。以下舉例為改變字型為最大(VB):

WebBrowser1.ExecWB OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, _      
                   CLng(4), Null      

再次代碼中, 我調用 ExecWB 方法, 傳遞OLECMDID_ZOOM 常量給第一個參數. 此常量指定 zoom 操作将被執行。 第二個參數傳遞給ExecWB 不要提示使用者。另外的選擇, 你可以提醒使用者而是用OLECMDEXECOPT_PROMPTUSER. (見 DocObj.h.)

第三個輸入參數訓示要設定的文字尺寸。我想是文字盡可能的大,是以我指定了4 。注意我在調用中使用了VB的Clng函數包裝此值,轉換我指定的此值為一個variant—輸入需要的類型.最後為一個輸出參數包含任何傳回值。因為傳回值不需要關心,我傳遞Null.

屬性

IWebBrowser2 接口有8個屬性。 (Table 6-6 按照vtable次序展示其)。他們都很直覺,我僅僅解釋恰宏很特别的一個—AddressBar.

Table 6-6.

IWebBrowser2 Properties in Vtable Order

屬性 描述
ReadyState 傳回WebBrowser 的狀态(換句話講 ,該屬性訓示文檔是否完成裝載). 盡管你可以使用 ReadyState 屬性, 使用 DocumentComplete 時間檢測文檔是否裝載還是比較好些。 (那意味着所有HTML和文檔被裝載
Offline .傳回或者設定檢測webbrowser是否處于脫機模式的變量
Silent 傳回或設定 WebBrowser 是否處于沉默模式。如果處于沉默模式,意味着沒有對話框可以被顯示.
RegisterAsBrowser .設定或者檢測Webbrowser是否是作為頂層浏覽器被登記
RegisterAsDropTarget .設定或傳回WebBrowser是否作為導航的拖放對象 。如果登記委托放對象,使用者可直接拖放連接配接到浏覽器  
TheaterMode 傳回或者設定Internet Explorer是否處于theater 或者 normal window 模式.。在theater 模式, Internet Explorer占據整個螢幕就像處于FullScreen 模式,但也有最小化的使用者接口元素 (此屬性僅僅展示于InternetExplorer 對象)
AddressBar 顯示或者隐藏位址欄(此屬性僅僅展示于InternetExplorer 對象)
Resizable 傳回或者設定Internet Explorer是否可被調整大小, 你可利用此屬性防止使用者改變webbrowser的大小(此屬性僅僅展示于InternetExplorer 對象)

AddressBar 屬性允許你顯示/隐藏Internet Explorer 位址欄—一個包含可輸入URL的文本框 允許你導航到某個Url。 能夠顯示或者隐藏位址條允許你完全控制你的使用者的導航體驗

在你的企業網絡或者中國小控制使用者導航體驗.在此環境下,你将控制使用者的導航以至于可确定某些不恰當地頁面不可通路。你可建立你自己的浏覽器。但是如果你沒有時間和資源這麼做,你可以自動化IE來代替.自動化IE允許你管掉所有的使用者界面允許使用者導航到某個web頁,像菜單條, 工具條,以位址欄. 之後你可建立一定數量的可通路web頁連接配接清單給使用者。

關掉這些使用者接口很容易. VB代碼:

InternetExplorer1.AddressBar = False      
InternetExplorer1.ToolBar = False      
InternetExplorer1.MenuBar = False