1. 程式人生 > >C++中嵌入IE瀏覽器(一)

C++中嵌入IE瀏覽器(一)

    最近專案中用html 來做介面,也就折騰了一下在wxwidget中嵌入瀏覽器的若干細節工作,mfc也基本是類似的,由於wxwidget中已經做了一個封裝wxie,但是開發過程中也遇到了不少問題,在此做一下總結: 

  1. ie邊框 及上下文選單
       普通嵌入到程式裡面的瀏覽器頁面都會有一個灰色的邊框,這樣放到程式裡面就很難看。目前網上流行的辦法新增css:
    body{
      border
    :0;
    }
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

     但是目前很多頁面用了比較新的css,改成這樣後,頁面就無法正常顯示了。讓網頁美工改樣式? 真是有點困難。
    後來繼續查閱了資料,發現比較好的辦法,那就是過載  IDocHostUIHandler 介面,其中,實現以下部分: 


HRESULT STDMETHODCALLTYPE FrameSite::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
    pInfo->cbSize = sizeof(DOCHOSTUIINFO);
    pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_SCROLL_NO;
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
    return S_OK;

}

       其中  DOCHOSTUIFLAG_NO3DBORDER 就表示不要生成邊框,DOCHOSTUIFLAG_SCROLL_NO 表示不要生成滾動條
這樣就可以比較完美的解決邊框和滾動條的問題,不用依賴頁面的調整 。讓設計師愛用什麼用什麼。
     另外一個就是禁用右鍵選單,網上也有不少辦法,但是用這個介面可以很簡單的實現: 
 

HRESULT STDMETHODCALLTYPE FrameSite::ShowContextMenu(DWORD dwID, POINT *ppt, 
                                                             IUnknown *pcmdtReserved, IDispatch *pdispReserved)
{
    HRESULT result    = S_FALSE; //Dont Interfere
    BOOL    handled    = FALSE;

    switch ( m_contextMenuMode )
    {
    case kDefaultMenuSupport:
        break;

    case kNoContextMenu:
        result    = S_OK;
        handled    = TRUE;
        break;

    case kTextSelectionOnly:
        if (dwID != CONTEXT_MENU_TEXTSELECT)
        {
            result    = S_OK;
            handled    = TRUE;
        }

        break;

    case kAllowAllButViewSource:
        if (dwID == CONTEXT_MENU_DEFAULT)
        {
            //result    = ModifyContextMenu(dwID, ppt, pcmdtReserved);
            handled    = TRUE;
        }

        break;

    case kCustomMenuSupport:
        if (dwID == CONTEXT_MENU_DEFAULT)
        {
            //result = CustomContextMenu(ppt, pcmdtReserved);
            handled    = TRUE;
        }

        break;
    }


    if (! handled)
    {
         result = S_FALSE;
    }


    return result;
}

    這裡不僅可以控制右鍵選單顯示,m_contextMenuMode  = kNoContextMenu,還可以做到自定義選單顯示,m_contextMenuMode  =其他值。因為暫時還不需要自定義選單,所以這裡沒有實現。
   
   如果用wxie,就在FrameSite類增加這個介面即可,不關注的介面直接返回S_FALSE 或E_NOTIMPL;

  如果用sdk或mfc,可以 呼叫IOleObject 的SetClientSite 方法,設定一個繼承了IOleClientSite 和 IDocHostUIHandler 的介面。

相關推薦

C++嵌入IE瀏覽器

    最近專案中用html 來做介面,也就折騰了一下在wxwidget中嵌入瀏覽器的若干細節工作,mfc也基本是類似的,由於wxwidget中已經做了一個封裝wxie,但是開發過程中也遇到了不少問題,在此做一下總結:  ie邊框 及上下文選單    普通嵌入到程式裡面的

使用CefSharp在.Net程序嵌入Chrome瀏覽器——簡介

get 做到 ini nta args als sta 就是 c++ 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(一)——簡介有的時候,我們需要在程序中嵌入Web瀏覽器,其實.Net Framework中本身就提供了WebBrowser控件,本身這個是

使用CefSharp在.Net程式嵌入Chrome瀏覽器——簡介

原文: 使用CefSharp在.Net程式中嵌入Chrome瀏覽器(一)——簡介 有的時候,我們需要在程式中嵌入Web瀏覽器,其實.Net Framework中本身就提供了WebBrowser控制元件,本身這個是最簡單易用的方案,但不知道是什麼原因,這個控制元件在瀏覽網頁的時候有些莫名的卡頓,有的時候甚至能

GUN C的socket學習

ipp 區分 如果 raw 文件表 一起 通訊 res 概念   socket是用於通信的工具。   套接字其實是一個廣義上的進程間通信的信道。就像pipe一樣,在GUN環境下socket也被用一個文件表示。不同的socket文件可以用於不同的進程間通信,甚至可以用來在網絡

使用CefSharp在.Net程式嵌入Chrome瀏覽器——啟動優化

在實際使用過程中,發現有的客戶端會出現chrome載入網頁過慢問題,定位後發現很多是因為設定系統代理所致,此時可以通過如下啟動引數禁止系統代理。 {"proxy-auto-detect", "0"},{"no-proxy-server", "1"}, 另外一個小技巧是: 由於cef本

使用CefSharp在.Net程式嵌入Chrome瀏覽器——Javascript互動

要在CEF中和網頁的JS進行互動,首先我們要通過設定啟用Javascrit整合功能。 CefSharpSettings.LegacyJavascriptBindingEnabled = true;   呼叫JavaScript: 簡單的呼叫JavaScript可以直接

使用CefSharp在.Net程式嵌入Chrome瀏覽器——除錯

chrome強大的除錯功能令許多開發者愛不釋手,在使用cef的時候,我們也可以繼承這強大的開發者工具。 整合除錯: 我們可以使用如下函式直接使用整合在chrome裡的開發者工具 _chrome.ShowDevTools(); 這種方式下,類似chrome中按F12,直接打開了一個開發者工具視窗,

使用CefSharp在.Net程式嵌入Chrome瀏覽器——效能問題

在使用CEF的過程中,我發現了一個現象:WPF版的CEF比Chrome效能要差:一些有動畫的地方會掉幀(例如,CSS動畫,全屏圖片拖動等),視訊播放的效果也沒有Chrome流暢。 查了一下相關資料,發現CEFSharp.WPF不是直接渲染在控制元件上的,它的大概流程如下: CEFSh

使用CefSharp在.Net程序嵌入Chrome瀏覽器——獨立文件夾部署

enable class 調試 getenv variable server 文件夾 consola href 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(十)——獨立文件夾部署CefSharp本身攜帶了一大堆文件,這些文件默認直接釋放在exe文件底下

使用CefSharp在.Net程序嵌入Chrome瀏覽器——Cookie

net 事件 consola delete www. etc 設置 size spa 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(八)——CookieCEF中的Cookie是通過CookieManager來管理的,可以用它來設置發送的Cookie。

使用CefSharp在.Net程序嵌入Chrome瀏覽器——參數設置

個性化 cache .html 下一個 back 下一步 init false family 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(二)——參數設置在實現了.Net程序中嵌入Chrome瀏覽器後,下一步的個性化操作就是加入一些設置了,在前面的文章

使用CefSharp在.Net程式嵌入Chrome瀏覽器——引數設定

原文: 使用CefSharp在.Net程式中嵌入Chrome瀏覽器(二)——引數設定 在實現了.Net程式中嵌入Chrome瀏覽器後,下一步的個性化操作就是加入一些設定了,在前面的文章中,我們可以看到在使用Chrome控制元件前,有如下一個操作:     var s

使用CefSharp在.Net程式嵌入Chrome瀏覽器——右鍵選單

原文: 使用CefSharp在.Net程式中嵌入Chrome瀏覽器(七)——右鍵選單 一個常用的功能就是禁止瀏覽器本身的右鍵選單,靠在WPF中攔截滑鼠事件是不行的,可以通過設定MenuHandler來實現。 首先實現一個IContextMenuHandler。  publ

使用CefSharp在.Net程式嵌入Chrome瀏覽器——基本操作

原文: 使用CefSharp在.Net程式中嵌入Chrome瀏覽器(三)——基本操作 CefSharp本身提供了WPF和WinForm兩個版本的控制元件,這兩個版本的控制元件使用方法大同小異,由於我WPF的版本用的較多,這裡就簡單的介紹下WPF版的CEFSharp控制元件的用法。 載入頁面: Chro

使用CefSharp在.Net程序嵌入Chrome瀏覽器——Javascript交互

vid font div tin 無法 異步 exe es6 black 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(五)——Javascript交互要在CEF中和網頁的JS進行交互,首先我們要通過設置啟用Javascrit集成功能。 CefShar

使用CefSharp在.Net程序嵌入Chrome瀏覽器——基本操作

rom () 操作 ast name 基本操作 red net logs 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(三)——基本操作CefSharp本身提供了WPF和WinForm兩個版本的控件,這兩個版本的控件使用方法大同小異,由於我WPF的版本用

使用CefSharp在.Net程序嵌入Chrome瀏覽器——啟動優化

單獨 ali 禁止 啟動速度 init 進程 efs 使用 res 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(四)——啟動優化在實際使用過程中,發現有的客戶端會出現chrome加載網頁過慢問題,定位後發現很多是因為設置系統代理所致,此時可以通過如下啟

使用CefSharp在.Net程序嵌入Chrome瀏覽器——性能問題

ext mage map chromium justify 問題 網上 bitmap 透明 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(九)——性能問題在使用CEF的過程中,我發現了一個現象:WPF版的CEF比Chrome性能要差:一些有動畫的地方會掉

使用CefSharp在.Net程序嵌入Chrome瀏覽器——右鍵菜單

靈活 white .html chrom mod new htm nco blue 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(七)——右鍵菜單一個常用的功能就是禁止瀏覽器本身的右鍵菜單,靠在WPF中攔截鼠標事件是不行的,可以通過設置MenuHandl

使用CefSharp在.Net程序嵌入Chrome瀏覽器——調試

ram 菜單 調試 com 快捷鍵 str alt F12 chromium 原文:使用CefSharp在.Net程序中嵌入Chrome瀏覽器(六)——調試chrome強大的調試功能令許多開發者愛不釋手,在使用cef的時候,我們也可以繼承這強大的開發者工具。 集成調試: