青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

統計

  • 隨筆 - 44
  • 文章 - 0
  • 評論 - 86
  • 引用 - 0

常用鏈接

留言簿(6)

隨筆分類(31)

隨筆檔案(44)

Mining

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

zz 自定義瀏覽器控件

同自動化瀏覽器(http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx)相比,自動化瀏覽器控件(WebBrowser Control) 在應用程序中更加常用。從Outlook的預覽窗格到Maxthon這樣的基于IE引擎的瀏覽器,從無界面的HTML分析器到Norton Antivirusd的主界面,瀏覽器控件在眾多領域被用作各種各樣的用途。這也使得有必要根據具體的用戶需求自定義瀏覽器控件的行為。

在應用程序中加入瀏覽器控件

集成瀏覽器控件的最簡單的方法是找一個支持ActiveX的集成開發環境,在工具箱中加入Microsoft Web Browser這個控件,往表單上拖一個這個控件就可以完成工作。你甚至可以用集成開發環境添加ActiveX的事件處理函數。如果要直接導入ActiveX的話,建議使用mehrcpp的vbMHWB控件(http://www.codeproject.com/atl/vbmhwb.asp)。這個控件在瀏覽器控件的基礎上進行了擴展,暴露了很多底層接口。

通常導入ActiveX就可以滿足大部分需求  ,但是有些類庫中也集成了瀏覽器控件,并且提供了更多的功能,例如MFC的CHTMLView和CDHtmlDialog,ATL的HTML Control,以及.Net 2.0中的Windows.Forms.WebBrowser。如果使用Visual C++來進行非托管編程,那么建議使用MFC或者ATL的封裝類,或者使用vbMHWB控件。托管編程中當然首選Windows.Forms.WebBrowser。除非這些類的BUG影響到了應用程序的開發,否則建議使用這些功能更加強大的封裝類。

在使用瀏覽器控件及其封裝類的時候要注意一些已知問題

常見任務

在集成瀏覽器控件之后,可以完成基本的網頁瀏覽,但是對于不同的任務,也需要進一步的處理,例如設置控件的屬性、為控件添加事件處理、操作HTML文檔等等。

修改瀏覽器控件的屬性

這在集成開發環境中可以很容易地設置,也可以自己實現容器來設置,但是CHTMLView這樣的封裝類沒有這個選項(http://support.microsoft.com/kb/197921)。

  • 鏈接目標解析。對于用瀏覽器控件來做瀏覽器的場合來說,需要將瀏覽器的RegisterAsBrowser屬性設置為true。這使得Internet Explorer在解析HTML鏈接的target屬性指定的目標窗口時可以找到這個窗口。
  • 禁用拖放。對于使用瀏覽器控件來做預覽窗格的場合來說,需要將瀏覽器的RegisterAsDropTarget屬性設置為false。這使得窗口不接受拖進來的文件和鏈接。
  • 禁用消息框。對于用瀏覽器控件來做HTML分析器的場合來說,有時需要屏蔽腳本產生的消息框以避免阻塞程序運行。這可以通過設置瀏覽器的Silent屬性來實現,或者實現IDocHostShowUI::ShowMessage。

捕獲瀏覽器控件的事件

集成開發環境中可以也很容易地添加瀏覽器的事件處理函數。比較常用的事件包括

  • NewWindow2或者NewWindow3事件。默認情況下,瀏覽器控件中創建的新窗口會是一個Internet Explorer的窗口。這通常不是預期的行為,對于瀏覽器程序來說更是這樣。需要處理瀏覽器的NewWindow2或者NewWindow3(在Windows XP SP2或者Windows 2003 SP1之后可用)事件來讓新的瀏覽器窗口在應用程序提供的窗口中運行。
  • WindowClosing事件。瀏覽器控件需要處理WindowClosing事件來在瀏覽器控件被腳本關閉時關閉瀏覽器控件的宿主窗口(http://support.microsoft.com/kb/253219)。
  • BeforeNavigate2事件。可以在自己的網頁中加入自定義的協議,之后在BeforeNavigate2事件中掃描URL來進行網頁和應用程序之間的交互(http://www.microsoft.com/msj/0100/c/c0100.aspx)。當然,自定義的網絡協議也可以用Asynchronous Pluggable Protocol來處理(參見http://support.microsoft.com/kb/303740),vbMHWB控件就實現了這個功能。但是更加常用的是在彈出廣告過濾器程序中用BeforeNavigate2來判斷在NewWindow2事件中創建的窗口是否需要關閉。

操作MSHTML文檔

通常HTML分析和瀏覽器自動化程序都需要分析網頁的結構,找到需要操作的元素。這需要對網頁的結構進行分析,找到目標元素的標識方法。 一些常用的操作包括:

 在頁面包含框架的時候,可能需要跨框架訪問HTML文檔。可以通過查詢框架元素所支持的IWebBrowser2接口或者IHTMLWindow2接口來訪問框架中的文檔(http://support.microsoft.com/kb/196340),但是也有可能因為安全設置而無法訪問(http://support.microsoft.com/kb/167796)。

在瀏覽器控件中顯示其它類型的文檔時,可以用IWebBrowser2的document屬性來訪問ActiveX文檔,例如在顯示Microsoft Word時,IWebBrowser2的document屬性就是Word的文檔對象,在顯示文件夾的時候,IWebBrowser2的document屬性就是文件夾對象等等。

擴展瀏覽器的宿主

瀏覽器控件在創建時會查詢ActiveX容器的IOleClientSite的實現的如下接口:IDocHostUIHandler, IDocHostUIHandler2 and IDocHostShowUI

雖然在無法自定義ActiveX容器的情況下可以用ICustomDoc::SetUIHandler來掛接IDocHostUIHandler到瀏覽器控件,但是這樣也會造成內存泄漏(http://support.microsoft.com/kb/893629)。一些類庫,例如MFC、ATL和.Net類庫都實現了IDocHostUIHandler接口。

除了專門用于瀏覽器用途的程序之外,通常都需要自定義瀏覽器控件的上下文菜單。這需要實現IDocHostUIHandler::ShowContextMenu。通常的實現包括完全禁用上下文菜單、完全替換上下文菜單、以及修改部分上下文菜單。經常被從上下文菜單中移除的菜單項包含查看源代碼、刷新和屬性。一種替代的方案是在容器中過濾右鍵消息(http://support.microsoft.com/kb/231578)。

與瀏覽器相比,一些Internet Explorer的宿主功能在瀏覽器控件中并不是默認啟用。在某些場合,默認啟用的宿主功能可能并非預期。這時需要實現IDocHostUIHandler::GetHostInfo。可以通過實現IDocHostUIHandler::GetHostInfo來自定義的功能包括:

  • 自動完成功能。對于用瀏覽器控件來做瀏覽器的場合來說,這個功能是有必要啟用的。啟用的方法是設置DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE位
  • 如果瀏覽器中的鏈接網址包含非ASCII的字符,那么需要實現IDocHostUIHandler::GetHostInfo,并且在返回的DOCHOSTUIINFO結構中設置dwFlags成員的DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8位。這使得網址會在發送之前用UTF-8編碼。
  • 3D邊框、滾動條,禁用文字選擇功能和禁用頁面上的腳本。
  • 對于使用瀏覽器控件來做HTML編輯器的場合來說,有時需要修改默認的頁面樣式。這都需要實現IDocHostUIHandler::GetHostInfo(http://support.microsoft.com/kb/328803)。注意在有些版本的IE中IDocHostUIHandler::GetHostInfo只在MSHTML被初始化的時候被調用,所以如果你需要在MSHTML被初始化之后使你的修改生效,你需要瀏覽到一個Word之類的非HTML Active document文檔,之后再瀏覽回來。

在使用瀏覽器控件來做數據錄入界面的場合,需要更改瀏覽器控件默認的Tab鍵處理使得用戶可以使用Tab鍵切換到容器中的其他控件。這需要實現IDocHostUIHandler::TranslateAccelerator來自定義瀏覽器控件的快捷鍵處理。對于MFC這樣用消息鉤子來做消息預處理的可自定義容器來說,也可以用PreTranslateMessage來過濾F5鍵盤消息,而不是實現IDocHostUIHandler::TranslateAccelerator。

在腳本中調用應用程序對瀏覽器控件的擴展,這需要實現IDocHostUIHandler::GetExternal。使用.Net的WebBrowser控件的話設置ObjectForScripting屬性就可以了。

對于用瀏覽器控件來做HTML分析器的場合來說,有時需要屏蔽腳本產生的消息框。這需要實現IDocHostShowUI::ShowMessage,或者設置瀏覽器的Silent屬性。

另外,瀏覽器也會查詢IOleClientSite來獲得其它的服務信息,例如

其他控制

對于用瀏覽器控件來做HTML分析器的場合來說,有時需要禁用瀏覽器的腳本、ActiveX或者圖片下載。這可以通過在容器中實現IDispatch,處理DISPID_AMBIENT_DLCONTROL來做到(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/overview/Overview.asp)。

看來離線瀏覽的控制并不能用這種方法來控制(http://support.microsoft.com/kb/247336)。不過你可以自己編寫一個HTTP層傳遞 BINDF_OFFLINEOPERATION標志 (http://groups-beta.google.com/group/microsoft.public.inetsdk.programming.mshtml_hosting/msg/76bf4910a289d4b3

在瀏覽器控件中java小程序可能不能正常運行,如果使用Sun JVM1.4之后的版本,可以用SetEnvironmentVariable 來設置JAVA_PLUGIN_WEBCONTROL_ENABLE為1來啟用Sun JVM。

默認情況下在頁面載入時會有點擊聲。屏蔽點擊聲的一個方法是在程序運行時修改注冊表鍵(http://support.microsoft.com/kb/201901),另一個方法是將瀏覽器控件隱藏,在調用Navigate2之后再顯示,但是這也需要鎖定控件的更新區域(LockWindowUpdate)以避免閃爍。在IE7中,也可以調用 CoInternetSetFeatureEnabled函數,傳遞FEATURE_DISABLE_NAVIGATION_SOUNDS來禁用瀏覽時的聲音。

在需要使用代理服務器時,有可能需要在應用程序中使用非默認的代理服務器設置。這可以通過調用UrlMkSetSessionOption來實現。

Overriding IInternetSecurityManager in a CComControl class
CAxWindow implements IObjectWithSite interface (get it with QueryHost
method). Call SetSite passing your implementation of IServiceProvider.
At this point, AxWin will forward all QueryService calls from hosted
WebBrowser to your implementation.

posted on 2008-04-18 22:29 泡泡牛 閱讀(1982) 評論(0)  編輯 收藏 引用 所屬分類: Develop

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本久道综合久久精品| 国模一区二区三区| 亚洲网站视频福利| 亚洲特色特黄| 欧美一级久久| 久久婷婷亚洲| 欧美黄色一区二区| 欧美日韩精品免费观看视频完整| 欧美日韩高清区| 欧美日韩在线一区二区三区| 国产精品久久久亚洲一区| 国产亚洲高清视频| 亚洲激情综合| 亚洲欧美资源在线| 久久这里有精品15一区二区三区| 亚洲二区在线观看| 亚洲欧洲综合另类| 亚洲欧洲av一区二区| 美日韩精品视频免费看| 国产精品久久久久久av下载红粉 | 国产一区二区三区无遮挡| 影音国产精品| 国产精品99久久久久久宅男| 欧美资源在线| 亚洲精选中文字幕| 久久精品综合| 国产精品日韩欧美综合| 亚洲精品日韩久久| 麻豆精品在线视频| 亚洲欧美中文另类| 欧美午夜免费| 99re热精品| 欧美高清在线视频| 国产日韩在线亚洲字幕中文| 噜噜噜91成人网| 欧美日韩精品一区二区在线播放 | 午夜精品久久久久久久久| 蜜桃av综合| 国产亚洲毛片在线| 亚洲综合国产| 亚洲日本成人| 另类酷文…触手系列精品集v1小说| 麻豆久久久9性大片| 久久久久久久综合狠狠综合| 欧美~级网站不卡| 国产精品制服诱惑| 一区二区三区视频免费在线观看| 久久久久亚洲综合| 亚洲图片欧美一区| 欧美激情精品久久久久久久变态| 国产综合精品一区| 欧美专区日韩视频| 亚洲淫性视频| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久九九国产| 亚洲欧洲日韩在线| 久久综合国产精品| 永久免费视频成人| 久久全国免费视频| 久久国产精品电影| 激情六月婷婷久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲免费视频一区二区| 国产精品一区亚洲| 久久久久久97三级| 欧美综合第一页| 经典三级久久| 欧美激情1区| 欧美日韩成人| 亚洲在线播放| 欧美一级电影久久| 尤物yw午夜国产精品视频| 欧美成人激情在线| 欧美区日韩区| 欧美一区二区三区在线观看视频 | 欧美一区二区三区免费大片| 亚洲欧美日韩另类精品一区二区三区| 亚洲一区精品电影| 亚洲影视在线播放| 国产午夜精品在线观看| 久久一区二区精品| 蘑菇福利视频一区播放| 国产精品99久久久久久www| 亚洲一区二区久久| 国产一区二区三区黄| 免费h精品视频在线播放| 欧美成人精品在线观看| 亚洲一区二区免费在线| 久久成人一区二区| 一区二区av| 欧美影院在线| 99精品欧美一区| 亚洲欧美成人| 91久久国产综合久久| 一区二区欧美日韩| 一区二区三区在线视频观看| 亚洲精选在线| 亚洲国产激情| 亚洲免费视频一区二区| 亚洲精品中文在线| 欧美一区二区三区在线免费观看| 亚洲国产精品传媒在线观看| 亚洲小视频在线| 亚洲国产另类 国产精品国产免费| 亚洲精品视频在线观看网站| 精品999久久久| 一区二区三区久久网| 在线播放豆国产99亚洲| 亚洲网站视频福利| 日韩午夜在线电影| 久久手机免费观看| 欧美在线观看一区二区三区| 欧美成人小视频| 麻豆视频一区二区| 国产亚洲欧美一区二区| 亚洲午夜久久久久久尤物 | 欧美三级视频在线播放| 欧美 日韩 国产 一区| 国产精品日本欧美一区二区三区| 欧美激情91| 尤物视频一区二区| 久久aⅴ国产欧美74aaa| 欧美亚洲一区二区在线| 欧美日韩国产不卡| 亚洲欧洲一区二区在线播放| 亚洲欧洲综合| 久久伊人免费视频| 久久综合给合| 极品少妇一区二区三区精品视频 | 欧美日韩一区二区三区在线视频| 欧美大片在线观看一区| 怡红院av一区二区三区| 久久久久久香蕉网| 免费黄网站欧美| 亚洲高清免费| 欧美3dxxxxhd| 亚洲精品综合在线| 亚洲天堂黄色| 国产精品欧美久久| 国产精品视频网| 亚洲高清一二三区| 日韩视频免费在线| 欧美人在线观看| 一区二区日韩欧美| 欧美一级播放| 国产午夜精品久久久久久免费视| 午夜激情一区| 久久综合久久久久88| 亚洲国内精品| 欧美日韩综合一区| 亚洲欧美高清| 美女国产一区| 亚洲最快最全在线视频| 国产精品久久久久久久久久免费看 | 亚洲免费精彩视频| 亚洲综合视频在线| 国产欧美一区二区精品忘忧草| 午夜视频久久久久久| 可以看av的网站久久看| 亚洲精品乱码久久久久久蜜桃91| 欧美女激情福利| 亚洲在线视频观看| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲精品网站在线播放gif| 国产精品国产a| 久久久午夜电影| 一本一本久久a久久精品综合麻豆| 欧美专区18| 99精品视频一区| 国产真实乱子伦精品视频| 欧美国产精品久久| 欧美资源在线观看| 一区二区三区久久久| 欧美激情免费在线| 久久九九免费视频| 宅男精品视频| 亚洲国产婷婷| 国产亚洲成av人在线观看导航 | 国产精品美女久久久久久免费| 欧美在线免费视频| 日韩一区二区精品| 免费看的黄色欧美网站| 欧美一区二区三区日韩| 99在线精品视频| 在线精品一区二区| 国产精品五区| 欧美日韩第一区日日骚| 久久天堂精品| 欧美一区二区在线观看| 一本大道久久精品懂色aⅴ| 欧美成人免费va影院高清| 香蕉久久夜色精品国产使用方法| 亚洲免费观看视频| 亚洲国产精品成人综合| 黑人巨大精品欧美一区二区 | 国产精品一区二区三区成人| 欧美日本亚洲视频| 免费日韩视频| 久久手机免费观看| 久久亚洲欧洲|