現在WebBrowserコントロールにファイルをドロップして
ユーザーにファイルの場所を指定してもらっています。
DocumentCompletedイベントで(WebBrowser).Url.IsFileで
ファイルかどうかを判断してファイルでなければ表示しないようにしています。
ふと思いついてゴミ箱をドロップしてみるとゴミ箱が表示されました。
ゴミ箱をドロップするユーザはいないと思うのですが
できればファイル以外はドロップできないようにしたいです。
マイコンピュータやゴミ箱では
DocumentCompletedイベントは実行されないので
(FileDownloadイベントしか起こりませんでした)
どのようにすればいいのか困っています。
ドロップでのファイル選択を禁止して
OpenFileDialogなんかでファイルを選択させるしか方法はないでしょうか?
何かささいなことでもご教授お願いします。
[OS:XPPro/VB:2008]
>DocumentCompletedイベントで(WebBrowser).Url.IsFileで
>ファイルかどうかを判断してファイルでなければ表示しないようにしています。
ファイル以外ドロップさせないなら、普通はDocumentCompletedイベントじゃなくて
Navigatingイベントの方でキャンセルするんじゃないでしょうか?
>マイコンピュータやゴミ箱では
>DocumentCompletedイベントは実行されないので
>(FileDownloadイベントしか起こりませんでした)
>どのようにすればいいのか困っています。
マイコンピュータやゴミ箱のときはどうもフレームワーク内部で例外が発生して
コントロールのNavigatingやDocumentCompletedのイベントにまで
通知されてきていないんじゃないかという気がしています。
#フレームワークのバグ?
DWebBrowserEvents2::BeforeNavigate2 を実装したイベントシンクを登録する方法を
一応試してみましたが、この場合はゴミ箱の場合でもきちんとハンドリングできたので
ゴミ箱の場合にキャンセルということ自体は不可能ではないようです。
WebBrowserコントロールを拡張したハンドリングの方法はWebBrowser.CreateSink メソッドの例が参考になります。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.createsink.aspx
インターフェースはこちら
http://www.pinvoke.net/default.aspx/Interfaces.DWebBrowserEvents2
subaruさんお返事ありがとうございます。
お返事が遅くなり申し訳ありません。
> >DocumentCompletedイベントで(WebBrowser).Url.IsFileで
> >ファイルかどうかを判断してファイルでなければ表示しないようにしています。
> ファイル以外ドロップさせないなら、普通はDocumentCompletedイベントじゃなくて
> Navigatingイベントの方でキャンセルするんじゃないでしょうか?
初めはNavigatingで記述していたのですが
(WebBrowser).Url.〜が取得済みのデータを返すので
DocumentCompletedを使用していたのですが
「キャンセル」というお言葉を頂いてe.Url.〜を使うことに気づきました。
DocumentCompletedだと画面がブレるので大変助かりました。
> DWebBrowserEvents2::BeforeNavigate2 を実装したイベントシンクを登録する方法を
> 一応試してみましたが、この場合はゴミ箱の場合でもきちんとハンドリングできたので
> ゴミ箱の場合にキャンセルということ自体は不可能ではないようです。
無理かなと思っていたのでとても希望が持てました。
試していただけたとは本当にありがとうございます。
ただ初心者ゆえ教えていただいたリンクを確認したのですが
いろいろと初歩的なところで詰まってしまいました。
また時間があるときにでも勉強して、
どうしてもわからない場合はまた質問させていただきますので
とりあえず解決とさせていただきます。
subaruさん本当にありがとうございました。