WebBrowser使用全接觸
在日常的開發程式的過程中,經常會遇到使用IE的問題,使用IE一般有兩種情況,一種是像監視GMmail信箱講到的那樣,另外一種是類似與CrazyBrowser這樣的使用webbrowser控制項的程式。
其實在程式中使用WebBrowser其實是一件很簡單的事情,因為有WebBrowser可以直接使用,但是能用和用起來可不是一樣的事情。下面就經常會用到的一些功能簡單的介紹介紹。
1.最經常使用的自然如何屏蔽預設的IE右鍵菜單,並且使用自訂的菜單。這方面網上有很多的文章進行說明,我就不獻醜了。因為我採用的辦法據說是最沒有創意的辦法。在PreTranslateMessage中判斷。
2.其實大多數情況下,我們還需要動態去設定Webbrowser控制項中的HTML 屬性,類似於自動填表之類的軟體,這樣的代碼與監視GMmail信箱中使用的方法類似。
3.我們知道在類似的程式中,我們一般都要去截取在WebBrowser中的一些javascript事件,比如adblock這樣的軟體就需要截取window.open這樣的代碼,如果我們在自己的程式中使用IE控制項的話,我們會希望IE頁面裡的Button Text Link就和我們在form中建立的Button,Text,Link完全一樣的被我們輕鬆自如的控制。
最早打算去建立一個全域的Hook來監視這樣的操作,但是這樣做一個是太麻煩,介面過於複雜,而且也不是標準的做法。
通過查看MSDN,發現其實MSHTML其實是提供了這樣的介面(與其說是MSHTML提供的介面,不如說是COM提供的介面),我用下面的代碼來示範 如何來截取一個href超文本連結的操作。
ON_EVENT(CDialog1, IDC_EXPLORER1, 259, DocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)
以便我們可以在所有的文檔載入完成後,來分析整個的文檔,然後通過監視GMmail信箱中介紹的辦法找到我們要監視的Href
if(strId.Find(cstrLink,0) != -1){
IHTMLAnchorElement * pButtonElem = NULL;
hr = pDisp->QueryInterface(IID_IHTMLAnchorElement, (void **)&pAnchorElem);
HiJackHref(pAnchorElem);
}
在HiJackHref的代碼中,我們通過如下的操作
hr = pAnchorElem ->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (hr == S_OK)
{
hr = pCPC->FindConnectionPoint(DIID_HTMLAnchorEvents2, &pCP);
if (hr == S_OK)
{
if (m_pHtmlEvent)
{
delete m_pHtmlEvent;
m_pHtmlEvent =NULL;
}
m_pHtmlEvent = new HtmlEvent;
m_pHtmlEvent ->SetParent(this);
IUnknown* pUnk = m_pHtmlEvent 2->GetInterface(&IID_IUnknown);
hr = pCP->Advise(pUnk, &dwCookie);
pCP->Release();
}
pCPC->Release();
}
至此,我們已經成功地在我們form和html之間建立起來了一座橋樑,我們只要用標準的COMEvent
就可以簡單方便的處理所有的html事件了,下面列出一些常用的事件
"HTMLELEMENTEVENTS2_ONCLICK", DISPID_HTMLELEMENTEVENTS2_ONCLICK
"HTMLELEMENTEVENTS2_ONMOUSEOVER", DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER
"HTMLELEMENTEVENTS2_ONMOUSEMOVE", DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE
"HTMLELEMENTEVENTS2_ONDBLCLICK", DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK
"HTMLELEMENTEVENTS2_ONMOUSEUP", DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP
"HTMLELEMENTEVENTS2_ONMOUSEDOWN", DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN
好了,這個問題到此就結束一大半了,為什麼說是一大半而不是全部呢?大家首先要回憶一下前面的紅色文字,我們這樣做的最大問題就是,如果我通過DHTML增加了一個Element以後,HiJack的程式就不能截取了,只能通過重新HiJack一次了,這樣多不方便呀,顯然不是豆腐的作風。
告訴大家一個小訣竅,可以為我們需要操縱的Element設定一個同樣名稱的自訂屬性,比如vid,然後再定義一個vname,這樣就在DocumentCompleteExplorer1去Hook vid為特定數值的Element 然後再HtmlEvent根據vname進行不同的操作。
至此,問題全部解決,剩下的就靠你自己了。
Note:
好久沒有更新自己的Blog了,開心也一再的催,不過實在是沒有辦法,最近這小半年的時間實在是太忙了,等到有時間了,會和各位朋友一起分享自己的心得。