WebBrowser上で右クリックを禁止するには?

解決


みやの霽  2003-11-02 02:41:54  No: 80210

WebBrowserコントロールからのアクセス時にページを右クリックを禁止(ポップアップを表示しない)したいのです。
ポップアップ→プロパティとかでURLを調べられないようにしたいのです。

過去ログ見たのですが、見当たらなかったので質問いたします。
よろしくお願いします。m(_ _)m


魔界の仮面弁士  2003-11-02 03:21:28  No: 80211

このような手法をとればOKです。
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp

VBを使ったサンプル。
http://msdn.microsoft.com/downloads/samples/internet/browser/WBcustomizer/default.asp


みやの霽  2003-11-02 11:04:47  No: 80212

魔界の仮面弁士殿、ご教授ありがとうございます。
でも、まだおれにはまだまだわからんですねw
とりあえず勉強して、理解しようと思います。
ありがとうございました。

もし、もう少しわかりやすく解説してあるようなサイト等ご存知の方がいらっしゃいましたら、お教えください。


魔界の仮面弁士  2003-11-02 21:00:28  No: 80213

とりあえず、理解は後回しでも良いのでは。
完全に理解しようとすると、VBではなく、C++の知識とCOMの知識が必要になってしまいますし。

とりあえず動作だけが目的なら、2番目のVBサンプル WBCustomizer.exe の中のコード
(WBCUSTOMIZER\VBCustomWB\VBCustomWB.vbp)をまねて、参照設定後に

Private CustomWB As WBCustomizer
Private Sub Form_Load()
    Set CustomWB = New WBCustomizer
    CustomWB.EnableContextMenus = False
    Set CustomWB.WebBrowser = WebBrowser1
    
    Me.WebBrowser1.Navigate2 "http://www.google.co.jp/"
End Sub

とするだけですよね。


みやの霽  2003-11-03 00:17:49  No: 80214

サンプルプログラムの最初のほうの宣言で、

  Dim CustomWB As WBCustomizer

が以下のようなエラーが出、

  コンパイル エラー:
  プロジェクトまたはライブラリが見つかりません。

となり、実行できないのです。
サンプルファイルにそれらしきコンポーネントファイルも見当たりません。

これはカンですが、サンプルに一緒に含まれているVC++ソースから、コンポーネ
ントファイルをコンパイルして生成しなければならないということなのではない
のでしょうか。
VC++持って無い人はどうすることもできないのでしょうか?


魔界の仮面弁士  2003-11-03 21:14:23  No: 80215

WBCustomizer.dll
http://support.microsoft.com/default.aspx?scid=kb;en-us;183235

> コンパイルして生成しなければならないということなのでは
そうなります。

WebBrowserにおけるショートカット(Ctrl+Nなど)や右クリックの動作を変更するには、
アプリ側でコールバック用のIDocHostUIHandlerインターフェイスを実装しておき、
それを、ICustomDocインターフェイスのSetUIHandlerで登録するという手順になります。
そして、ICustomDoc.ShowContextMenuでS_OKを返すかS_FALSEを返すかで、
規定のポップアップを表示させるか否かを制御できるというわけです。

> VC++持って無い人はどうすることもできないのでしょうか?
VBでは、インターフェイスを明示的に宣言するための手段が用意されていませんので、
そういった意味では、VB単体では基本的には無理…という結論になります。
別途用意する言語がVC++である必要はありませんが、サンプルが提供されている以上、
VC++の方が望ましいでしょう。VC++を持っている人にコンパイルしてもらって下さい。

なお、代替手段として、WebBrowser.Documentからのoncontextmenuイベントを
キャンセルさせるようにする……という方法もあります。
MSHTML.TLBを参照設定した上で、こんな感じですね。

Option Explicit

Private WithEvents Document As MSHTML.HTMLDocument

Private Sub Command1_Click()
    'ボタンを押すと、右クリックが禁止されます。
    Set Document = WebBrowser1.Document
End Sub

'右クリックされた時に呼ばれるイベント
Private Function Document_oncontextmenu() As Boolean
    'Trueを返すと、WebBrowserの規定の動作が行われます。
    'Falseを返した場合は、WebBrowserは何もしません。
    Document_oncontextmenu = False
End Function

Private Sub Form_Load()
    WebBrowser1.Navigate2 "http://www.google.co.jp/"
End Sub

これならば、VBだけで行う事が可能ですが、フレームセットを使ったページの場合は、
各フレームごとに oncontextmenu を握りつぶす必要がありますし、ページが切り替わるたびに
WithEvents変数への再割り当てが必要になります。また、Setするタイミングの問題もありますので、
可能であれば、IDocHostUIHandlerを実装する方向で考えた方が良いでしょう。


魔界の仮面弁士  2003-11-03 21:54:41  No: 80216

> 可能であれば、IDocHostUIHandlerを実装する方向で考えた方が良いでしょう。

以下、IDocHostUIHandlerを使ったサンプルです。
VB自身には、IDocHostUIHandlerやICustomDocを定義する機能がないので、
他の言語(C++、IDL、ODLなど)を使ってタイプライブラリを生成しておき、
それを参照設定する必要があります。

なお下記では、Eduardo A. Morcilloさんのライブラリを利用させてもらっています。
http://www.mvps.org/emorcillo/

Option Explicit

Implements IDocHostUIHandler
Private CustomDoc As ICustomDoc

Private Sub Form_Load()
'    WebBrowser1.Navigate2 "http://www.google.co.jp/"
    WebBrowser1.Navigate2 "http://www.bcap.co.jp/hanafusa/index.html"
    Do
        DoEvents
        Set CustomDoc = WebBrowser1.Document
    Loop While CustomDoc Is Nothing
    CustomDoc.SetUIHandler Me
End Sub

'規定の右クリック動作に関する実装
Private Sub IDocHostUIHandler_ShowContextMenu(ByVal dwContext As olelib.ContextMenuTarget, pPOINT As olelib.POINT, ByVal pCommandTarget As olelib.IOleCommandTarget, ByVal HTMLTagElement As Object)
    'ここに、代替の処理を記述します。
    'dwContext: どのコンテキストメニューが呼ばれたかを識別するフラグ
    'pPOINT: 座標(x, y)を表すPOINT構造体
    'pCommandTarget: オブジェクトの動作
    'HTMLTagElement: 対象のHTMLエレメント
End Sub

'Implementsした為、他のメソッドについても、プロシージャ実装が必要になります。
'適宜、必要な処理を記述していって下さい。
Private Sub IDocHostUIHandler_EnableModeless(ByVal fEnable As olelib.BOOL)
End Sub
Private Function IDocHostUIHandler_FilterDataObject(ByVal pDO As olelib.IDataObject) As olelib.IDataObject
End Function
Private Function IDocHostUIHandler_GetDropTarget(ByVal pDropTarget As olelib.IDropTarget) As olelib.IDropTarget
End Function
Private Function IDocHostUIHandler_GetExternal() As Object
End Function
Private Sub IDocHostUIHandler_GetHostInfo(pInfo As olelib.DOCHOSTUIINFO)
End Sub
Private Sub IDocHostUIHandler_GetOptionKeyPath(pOLESTRchKey As Long, ByVal dw As Long)
End Sub
Private Sub IDocHostUIHandler_HideUI()
End Sub
Private Sub IDocHostUIHandler_OnDocWindowActivate(ByVal fActivate As olelib.BOOL)
End Sub
Private Sub IDocHostUIHandler_OnFrameWindowActivate(ByVal fActivate As olelib.BOOL)
End Sub
Private Sub IDocHostUIHandler_ResizeBorder(prcBorder As olelib.RECT, ByVal pUIWindow As olelib.IOleInPlaceUIWindow, ByVal fRameWindow As olelib.BOOL)
End Sub
Private Sub IDocHostUIHandler_ShowUI(ByVal dwID As Long, ByVal pActiveObject As olelib.IOleInPlaceActiveObject, ByVal pCommandTarget As olelib.IOleCommandTarget, ByVal pFrame As olelib.IOleInPlaceFrame, ByVal pDoc As olelib.IOleInPlaceUIWindow)
End Sub
Private Sub IDocHostUIHandler_TranslateAccelerator(lpmsg As olelib.MSG, pguidCmdGroup As olelib.UUID, ByVal nCmdID As Long)
End Sub
Private Function IDocHostUIHandler_TranslateUrl(ByVal dwTranslate As Long, ByVal pchURLIn As Long) As Long
End Function
Private Sub IDocHostUIHandler_UpdateUI()
End Sub


みやの霽  2003-11-05 04:02:09  No: 80217

> > コンパイルして生成しなければならないということなのでは
> そうなります。

> > VC++持って無い人はどうすることもできないのでしょうか?
>VBでは、インターフェイスを明示的に宣言するための手段が用意されていませんので、
> そういった意味では、VB単体では基本的には無理…という結論になります。
> 別途用意する言語がVC++である必要はありませんが、サンプルが提供されている以上、
> VC++の方が望ましいでしょう。VC++を持っている人にコンパイルしてもらって下さい。

分かりました。
どうもありがとうございました。
VBはVC++よりも融通が利かない、と言われる所以を身をもって実感しましたねw
勉強になりました。m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加