WebBrowser使用全接觸

來源:互聯網
上載者:User

 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了,開心也一再的催,不過實在是沒有辦法,最近這小半年的時間實在是太忙了,等到有時間了,會和各位朋友一起分享自己的心得。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.