日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#开发IE控件

發布時間:2023/12/10 C# 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#开发IE控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
c#開發IE控件主要是對BHO對象是使用,但是我們知道BHO是一個COM對象,而在.NET下開發基于COM的應用,總覺得不是很簡單,這里有受控代碼與COM的調用,我查找了下,國內并沒有此類信息,下面是譯稿,翻譯的不好,歡迎指出.

介紹:
我們在瀏覽Internet信息的時候,往往需要增強用戶瀏覽信息的,IE瀏覽器其實是一個可擴展的模型,提供了大量的插件來完成這樣的目標.其實很多時 候你已經在使用了,比如GOOGLE的工具條,Babelfish Translator,等你很多時候都在使用,這些插件都是擴展BHO或瀏覽器中Band的對象,用這些插件來集成一些復雜的功能,具體是實現一個COM 的接口.
許多BHO對象的實現都是利用C+編寫一個ATL 組件,如果用c#來寫,即用受控代碼來實現COM 和 ATL ,好象是不可能實現的,但是很幸運,NET Framework提供了百分之百的與COM的互操作,在這篇文章里,我介紹下怎么利用.NET的互操作性來實現一個BHO對象.

認識下COM:

我多年從事c++,MFC,VB,ATL的開發,所以,在.NET之前我想成為一個優秀的COM開發者,正因為如此,COM的互操作性一直在我腦海里,雖然時間一長,我開發的都是完全用.NET開發的項目,COM變得很遙遠,但有的時候,
比如我想改寫一個ATL BHO 組件讓c#來使用,這個想法又付出水面.

在進一步了解BHO細節之前,有幾點我需要進一步闡述。首先,BHO對象依托于瀏覽器主窗口。實際上,這意味著一旦一個瀏覽器窗口產生,一個新的BHO對 象實例就要生成。任何 BHO對象與瀏覽器實例的生命周期是一致的。其次, BHO僅存在于Internet Explorer 4.0及以后版本中。
如果你在使用Microsoft Windows? 98, Windows 2000, Windows 95, or Windows NT版本4.0 操作系統的話,也就一塊運行了活動桌面外殼4.71,BHO也被 Windows資源管理器所支持。 BHO是一個COM進程內服務,注冊于注冊表中某一鍵下。在啟動時,Internet Explorer查詢那個鍵并把該鍵下的所有對象預以加載。

BHO對象隨著瀏覽器主窗口的顯示而裝入,隨著瀏覽器主窗口的銷毀而缷載。如果你打開多個瀏覽器窗口,多個BHO實例也一同產生。
無論瀏覽器以什么樣的命令行啟動,BHO對象都被加載。舉例來說,即使你只是想要見到特定的 HTML 頁或一個給定的文件夾,BHO對象也被加載。一般地,當 explorer.exe 或 iexplore.exe 運行的時候,BHO都要被考慮在內。如果你設置了"Open each folder in its own window"(對每一個文件夾以一個獨立窗口打開)文件夾選項,那么你每次打開一個文件夾,BHO對象都要被加載

如前所述,一個BHO對象會被Internet Explorer或者Windows資源管理器(前提:外殼版本4.71或者更高)所加載。所以我專門設計了一個BHO來處理HTML網頁,因此這個 BHO與資源管理器毫無關系。如果一個Dll不想被調用者一起加載,只需在DllMain()中實現了探明誰在調用該對象后返回FALSE即可。參看下面 代碼:


if (dwReason == DLL_PROCESS_ATTACH){TCHAR pszLoader[MAX_PATH];//返回調用者模塊的名稱,第一個參數應為NULL,詳見msdn。 GetModuleFileName(NULL, pszLoader, MAX_PATH);_tcslwr(pszLoader);if (_tcsstr(pszLoader, _T("explorer.exe")))return FALSE;}一旦知道了當前進程是Windows資源管理器,可立即退出。
注意,再多加一些條件語句是危險的!事實上,另外一些進程試圖裝入該DLL時將被放棄。如果你做另外一個試驗,比方說針對Internet Explorer的執行文件iexplorer.exe,這時第一個受害者就是regsvr32.exe(該程序用于自動注冊對象)。


if (!_tcsstr(pszLoader, _T("iexplore.exe")))  你不能夠再次注冊該DLL庫了。 事實上,當 regsvr32.exe 試圖裝入DLL以激活函數DllRegisterServer()時,該調用將被放棄。

八、與Web瀏覽器取得聯系
SetSite()方法正是BHO對象被初始化的地方,此外,在這個方法中你可以執行所有的僅僅允許發生一次的任務。當你用Internet Explorer打開一個URL時,你應該等待一系列的事件以確保要求的文檔已完全下載并被初始化。唯有在此時,你才可以通過對象模型暴露的接口(如果存 在的話)存取文檔內容。這就是說你要取得一系列的指針。第一個就是指向IWebBrowser2(該接口用來生成WebBrowser對象)的指針。第二 個指針與事件有關。該模塊必須作為一個瀏覽器的事件偵聽器來實現,目的是為接收下載以及與文檔相關的事件。下面用ATL靈敏指針加以封裝:


CComQIPtr< IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer> m_spCPC;源代碼部分如下所示:


HRESULT CViewSource::SetSite(IUnknown *pUnkSite){// 檢索并存儲 IWebBrowser2 指針m_spWebBrowser2 = pUnkSite;if (m_spWebBrowser2 == NULL)return E_INVALIDARG;//檢索并存儲 IConnectionPointerContainer指針m_spCPC = m_spWebBrowser2;if (m_spCPC == NULL)return E_POINTER;//檢索并存儲瀏覽器的句柄HWND. 并且安裝一個鍵盤鉤子備后用RetrieveBrowserWindow();// 為接受事件通知連接到容器return Connect();}  為了取得IWebBrowser2接口指針,你可以進行查詢。當然也可以在事件剛剛發生時查詢 IConnectionPointContainer。這里,SetSite()檢索了瀏覽器的句柄HWND,并且在當前線程中安裝了一個鍵盤鉤子。 HWND用于后面Internet Explorer窗口的移動或尺寸調整。這里的鉤子用來實現熱鍵功能,用戶可以按動熱鍵來顯示/隱藏代碼窗口。

九、從Internet Explorer瀏覽器取得事件
當你導向一個新的URL時,瀏覽器最需要完成的是兩種事件:下載文檔并為之準備HOST環境。也就是說,它必須初始化某對象并使該對象從外部可以利 用。針對不同的文檔類型,或者裝入一個已注冊的Microsoft ActiveX? 服務器來處理該文檔(如Word對于.doc文件的處理)或者初始化一些內部組件來分析文檔內容并生成和顯示該文檔。對于HTML網頁就是這樣,其內容由 于DHTML對象作用而變得可用。當文檔全部下載結束,DownloadComplete事件被激活。這并不是說,這樣利用對象模型就可以安全地管理文檔 的內容了。事實上,DocumentComplete 事件僅指明一切已經結束,文檔已準備好了 (注意DocumentComplete事件僅在你第一次存取URL時到達,如果你執行了刷新動作,你僅僅收到一個DocumentComplete事 件)。
為了截獲瀏覽器發出的事件, BHO需要通過IConnectionPoint 接口連接到瀏覽器上 并且實現傳遞接口IDispatch指針以處理各種事件。現在利用前面取得的IConnectionPointContainer指針來調用 FindConnectionPoint方法――它返回一個指針指向連接點對象(正是通過這個連接點對象來取得要求的外向接口,此時是 DIID_DWebBrowserEvent2)。 下列代碼顯示了連接點的發生情況:


HRESULT CViewSource::Connect(void){HRESULT hr;CComPtr<IConnectionPoint> spCP;//為Web瀏覽器事件而接收(receive)連接點hr = m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvent2, &spCP);if (FAILED(hr))return hr;// 把事件處理器傳遞到容器。每次事件發生容器都將激活我們實現的IDispatch接口上的相應的函數。hr = spCP->Advise( reinterpret_cast<IDispatch*>(this), &m_dwCookie);return hr;}  通過調用接口IConnectionPoint的Advise() 方法, BHO告訴瀏覽器它對它產生的事件很感興趣。 由于COM事件處理機制,所有這些意味著BHO把IDispatch接口指針提供給瀏覽器。瀏覽器將回調IDispatch接口的Invoke() 方法,以事件的ID值作為第一參數:


HRESULT CViewSource::Invoke(DISPID dispidMember, REFIID riid,LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr){if (dispidMember == DISPID_DOCUMENTCOMPLETE) {OnDocumentComplete();m_bDocumentCompleted = true;}:}  切記,當事件不再需要時,應該使之與瀏覽器分離。如果你忘記了做這件事情,BHO對象將被鎖定,即使在你關閉瀏覽器窗口之后。很明 顯,實現分離的最佳時機是收到事件OnQuit時。

轉載于:https://www.cnblogs.com/longyi/archive/2009/05/19/1459799.html

總結

以上是生活随笔為你收集整理的c#开发IE控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。