2009-07-08 51 views
1

我正在託管一個Web瀏覽器控件,並且想要提供我自己的上下文菜單。將自定義上下文菜單添加到託管的Web瀏覽器控件

理想情況下,我想提出自己的上下文菜單,其中包含原始瀏覽器的上下文菜單(包括所有插件等)作爲子菜單。

如果這是不可能的/棘手的,我可以與例如通常顯示我的上下文菜單,並在用戶按下SHIFT時顯示原始的菜單。

我需要執行IDocHostUIHandler嗎?如果是的話,我該如何指定一個自定義上下文菜單,我該如何強制原始的菜單?我如何獲得控件來使用我的實現?

控制是這樣產生(處理省略錯誤):

HRESULT hr=AtlAxCreateControlEx(
    L"Shell.Explorer",m_wndWebCtrl.m_hWnd, 
    NULL,NULL,(IUnknown**)&unk, 
    IID_IWebBrowser2, NULL); // (IPersistStreamInit*)this); 

hr = AtlAdviseSinkMap(this, true); 

IUnknownPtr unk; 
AtlAxGetControl(m_wndWebCtrl.m_hWnd, &unk); 

IWebBrowser2Ptr browser2 = unk; 

回答

1

是的,你確實需要實現IDocHostUIHandler

好吧,我想你可以攔截右鍵單擊,擊鍵和其他通常會顯示上下文菜單的消息......但是,這可能遲早會崩潰;至少,我希望它打破可訪問性。

一旦你截獲了IDocHostUIHandler::ShowContextMenu(),你可以選擇返回S_OK以在顯示你自己的內容後壓制內置菜單。您可以使用普通的Win32菜單例程用於此目的,自定義控件,甚至是花哨的HTML,如果這對您有幫助。根據文檔,提供了足夠的上下文以允許您確定請求的元素上下文以及默認的上下文菜單是什麼。

不幸的是,我知道沒有辦法獲得內置菜單的句柄。如果用戶選擇了「原始」選項,您可以通過顯示上下文菜單來僞造它,然後返回S_FALSE,但即使如此,也無法將結果菜單附加到現有的彈出式菜單中(實際上,無論如何,如果你正在運行這種彈出窗口的共同模態循環)。有可能到add options to the built-in menus

您應該能夠使用GetKeyboardState()確定菜單被請求時的shift鍵的狀態。


假設你只想要正常的瀏覽器功能反正,你可能會得到更好的只是重新實現你想要的選項(後退,前進,打印)服務的一個子集,如果調用相應的命令用戶選擇它們。或者,如果您只想在特定情況下使用普通菜單(例如:在textarea中編輯命令),請使用參數ShowContextMenu()來標識此參數,然後返回S_FALSE以觸發默認設置。後一種技術我運氣不錯,畢竟,他們應該是上下文菜單 ...

+0

謝謝Shog :)我只是不想完全切斷用戶的默認功能,所以我猜GetKeyboardState會做的。也碰巧知道我如何告訴ATL在其客戶端實現中使用我的IDocHostUIHandler? – peterchen 2009-07-08 18:28:52

1

我加入以下信息如何「注入」你自己DocHostUI落實到瀏覽器控件:

默認的方式是實現IOleClientSite,並支持IDocHostUIHandler實現對象。

有一個更簡單的方法:在DocumentComplete處理程序中,查詢IHTMLDocumenntICustomDoc,它允許您從獨立對象提供您的接口。這允許你保持你的環境提供的IOleClientSite實現。

更多詳細信息可查詢here

相關問題