2009-07-08 5 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を実装する必要があります。

[OK]をクリックすると、右クリック、キーストローク、および通常はコンテキストメニューを表示するその他のメッセージを傍受することができると思います...しかし、少なくとも、私はそれがアクセシビリティを破ると期待しています。

IDocHostUIHandler::ShowContextMenu()を傍受したら、S_OKを返すことで、自分自身を表示した後に内蔵メニューをスケルチすることができます。この目的のために通常のWin32メニュールーチン、カスタムコントロール、またはそれがあなたのためにできるならば、派手なHTMLを使用することができます。ドキュメントごとに、どの要素コンテキストが要求されているか、そしてデフォルトのコンテキストメニューとなるかを決定するのに十分なコンテキストが提供されています。

残念ながら、私は組み込みメニューのハンドルを取得する方法がないことを知っています。おそらくコンテキストメニューを表示し、ユーザが「元の」オプションを選択した場合はS_FALSEを返すことでそれを偽造することができますが、その場合でも、結果として得られるメニューを既存のポップアップメニューに添付する方法はありません。そのようなポップアップに共通するモーダルループを実行している場合は、とにかく戻ってください)。 add options to the built-in menusに可能です。

GetKeyboardState()を使用して、メニューが要求されたときにシフトキーの状態を判断できるはずです。

だけとにかく通常のブラウザ機能 のサブセットをしたい、あなたはより良いあなたが(前方バック、プリント)するオプションを再実装した場合、適切なコマンドを呼び出すことによって提供されるかもしれないと仮定すると、

ユーザーが選択します。あるいは、非常に特殊なシナリオ(例えば、テキストエリア内のコマンドの編集など)で通常のメニューのみを使用する場合は、ShowContextMenu()引数を使用してこれを特定し、S_FALSEを返してデフォルトをトリガーします。私はこの後者の技術でかなり幸運を覚えました。結局、彼らコンテキストメニューであることをを想定している...

+0

ありがとうございました:)私はちょうどデフォルトの機能から完全にユーザーを切り離したくないので、GetKeyboardStateがそのトリックをすると思います。クライアントサイトの実装でIDocHostUIHandlerを使用するようにATLに指示する方法も知っていますか? – peterchen

+0

私は恐れているとは言えません...自分でATLを使ってみたことはありません。多分これが助けになるでしょうか? http://support.microsoft.com/kb/274202 – Shog9

1

私は、ブラウザコントロールに独自のDocHostUIの実装を「注入」する方法以下の情報を追加しています:

デフォルトの方法がにありますIOleClientSiteを実装し、実装オブジェクトにIDocHostUIHandlerをサポートします。

より簡単な方法があります。DocumentCompleteハンドラでは、IHTMLDocumenntICustomDocに照会して、スタンドアロンオブジェクトからインターフェイスを指定できます。これにより、環境が提供するIOleClientSiteの実装を維持することができます。

詳細はhereです。

関連する問題