VB6.0でタイトルのようなことをしたいのですが、Webbrowserコントロール内に表示された文字をマウスでドラッグ(反転表示?)して
ドラッグされた部分をマウスでドラッグ&ドロップでテキストエディタなどに入れると選択されているテキストがコピー?されてしまいます。
この動作を禁止したいのですが、どうすれば防ぐことができるのでしょうか?
Webbrowser1_DragDrop
Webbrowser1_DragOver
ではイベントを取得できませんでした。
また、
Webbrowser1_GotFocus
で別コントロールにSetFocusしてみましたが、選択できてしまいます。
よろしくお願いします。
右クリックの監視+Ctrlキーの監視でやってみたらどうでしょう?
>名無しさん
有難うございます。
説明不足で申し訳なかったのですが、
・右クリック禁止
・Ctrl+C禁止
はすでに完成していて、最初の質問内容でもテキストがコピーされてしまうことに気が付き
そこの制御方法が思いつかなかったので質問しました。
よろしくお願いします。
コピーだけが禁止できればよいのでしょうか? それとも、
ドラッグ選択する事を禁止したいのでしょうか?
イベントベースで処理するなら、
コピー禁止 → onbeforecopy イベントをキャンセルする
ドラッグ禁止 → onselectstart イベントをキャンセルする
といった方法になります。
http://msdn.microsoft.com/workshop/author/dhtml/reference/events/onbeforecopy.asp
http://msdn.microsoft.com/workshop/author/dhtml/reference/events/onselectstart.asp
ちなみに、ブラウザの細かい動作まで本格的に制御しようとなると、
正攻法では、IDocHostUIHandler インターフェイスを VB 側で実装して、
ブラウザからの応答に答えるなど、それなりの手間が必要だったりします。
IDocHostUIHandler 関連
http://msdn.microsoft.com/archive/en-us/samples/internet/browser/WBcustomizer/default.asp
http://msdn.microsoft.com/workshop/browser/hosting/reference/ifaces/idochostuihandler/idochostuihandler.asp
http://support.microsoft.com/kb/183235/en-us
>魔界の仮面弁士さん
有難うございます。
コピーを禁止したいのですが、選択部分をテキストエディタなどにドラッグ&ドロップすると同じ文字列が写されてしまうのですがこれはコピーになるのでしょうか?(クリップボードに入っていないようですが)
現状を考えると、選択不可にするのがいいのかなぁと思いまして教えていただいた「onselectstart」について調べてみましたところ
Bodyタグ?に追加することで可能になることがわかり、Webbrowser1_DocumentCompleteイベントに以下のソースを追加しましたが選択不可になりませんでした。
Webbrowser1.Document.body.onselectstart = "return false"
しかし、テキストファイルにWebbrowser1.Document.body.outerhtmlの内容をコピーしてHTML形式で開くと選択不可になっています。
なぜWebbrowserコントロールでは選択不可にならないのでしょうか?
よろしくお願いします。
※追記
選択不可に設定したHTMLファイルをWebbrowserに読み込ませてみたところ
選択不可の状態になっていました。
DocumentCompleteで選択不可の設定が反映されていないためということが分かりましたが、反映のさせ方がわかりません。。。
追加の参照設定なしでやりたい場合には、
Set WebBrowser1.Document.Body.onselectstart = New Class1
のように指定してください。
ここで渡す Class1 は、たとえば
Option Explicit
Public Function Hoge() As Variant
Hoge = False
End Function
のようなクラスです。単に False を返しているだけですね。
なお、この Hoge メソッドのプロシージャIDを、『(既定値)』に
しておいてください。(プロシージャ属性ダイアログにて変更できます)
ちなみに、MSHTML.TLB を参照設定しても良いなら、こんな感じ。
Private WithEvents Body As MSHTML.HTMLBody
Private Function Body_onselectstart() As Boolean
Body_onselectstart = False
End Function
>魔界の仮面弁士さん
有難うございました。
Classを追加して実現できました。
ツイート | ![]() |