none
webBrowserコントロールでドラッグ&ドロップはできますか? RRS feed

  • 質問

  •  

    いつもお世話になります。

     

    Visual Studio 2008 で,webBrowser コントロールを使ったHTMLエディタを作成しています。

     

    HTMLファイルをwebBrowser コントロールにドラッグ&ドロップすると,そのファイルへのリンクを自動生成するという動作を作りたいと思っています。

     

    普通ですと,HTMLファイルが表示されてしまうので,AllowWebBrowserDrop プロパティ を False に設定しています。

     

    通常,テキストボックスなどへのドラッグ&ドロップは作った経験があります。

     

    しかし,webBrowser コントロールには AllowDropプロパティ,DragDrop イベント,DragEnter イベントなどドラッグ&ドロップに必要な機能は無効であると,MSDNにありました。

     

    それならば,MouseOver イベントなどを使えばできるのかと,いろいろと調べたのですが,どうにも良い解決方法を考え出すことができませんでした。

     

    webBrowser コントロールへのドラッグ&ドロップを,プログラムで制御する方法をご存知でしたら,お知恵を拝借いただければ幸いです。

     

    また,何か私が勘違いしていて簡単にできるようなものであれば,アドバイスいただけますでしょうか。

     

    よろしくお願いいたします。

    2008年6月21日 3:39

回答

  • 正直なところ、お薦めできません。別の道を模索した方がいいような気がします。

    実現できたとしても、かなりの苦労を要すると推察されるためです。

     

     

    まず、ネイティブの話ですが、OLE D&DはIDropTargetインターフェースを実装したクラスのインスタンスをRegisterDragDrop関数で登録することで実現されています。

    この動作を、.NETのMouseDownイベントやMouseOverイベント等で制御することはできません。

     

    やるとすれば、IDropTargetを差し替えることですが、本当にできるのか?、問題ないのか?といった疑問がありますし、ヘタに触ると不安定になりそうで怖いものです。

    WebBrowserコントロールがその差し替える機能を提供していないので、ネイティブに近いコードを書かざる得ない可能性もあります。

    2008年7月1日 14:22
    モデレータ
  • ※ 解決策の提示じゃありません、情報の提示です。

     

    本件には全く気付いていなかったのですが、私も空想中にふと思ったので検索
    したら、ちょうど本件に当たりました。


    en-us のフォーラムで "webbrowser drag drop" をキーに検索したら 57件 出
    ました。緑のチェックアイコンが付いているので、解決しているようですが、
    本当にそうか怪しい。

    読まれて、解決方法が分かったら、ここで教えてください。

     

     

    ちなみに、フォーラム外でも質問が出ていて、全く無反応という結果でした。

    2008年6月30日 16:45
  • 最終的にファイルを WebBrowserコントロールにドロップ出来れば良いのですよね?

    ならばちょっと視点を変えてこんなのはどうでしょう。(以下C#)

     

    void foo()

    {

       this.webBrowser1.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
    }

     

    void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {

       // e.Url にドロップされたファイルのパスが入っている。

     //  しかしそのままではブラウザコントロールが反応してしまうので、
     // 適切に判断して e.Cancel = true; で制御する。
    }

     

    ・・・・ 一番楽で確実なのはこれかと。 単に動作としてD&Dが出来ればいいのなら。

    ただし当然ですが、自分で Navigate(String) した際にも反応しますので、そこの判断は別途必要です。

    フラグ立てて切り分けるとか。

     

    もしも他に方法が無いなら、試してみて下さい。

    2008年7月5日 12:25

すべての返信

  • ※ 解決策の提示じゃありません、情報の提示です。

     

    本件には全く気付いていなかったのですが、私も空想中にふと思ったので検索
    したら、ちょうど本件に当たりました。


    en-us のフォーラムで "webbrowser drag drop" をキーに検索したら 57件 出
    ました。緑のチェックアイコンが付いているので、解決しているようですが、
    本当にそうか怪しい。

    読まれて、解決方法が分かったら、ここで教えてください。

     

     

    ちなみに、フォーラム外でも質問が出ていて、全く無反応という結果でした。

    2008年6月30日 16:45
  • 正直なところ、お薦めできません。別の道を模索した方がいいような気がします。

    実現できたとしても、かなりの苦労を要すると推察されるためです。

     

     

    まず、ネイティブの話ですが、OLE D&DはIDropTargetインターフェースを実装したクラスのインスタンスをRegisterDragDrop関数で登録することで実現されています。

    この動作を、.NETのMouseDownイベントやMouseOverイベント等で制御することはできません。

     

    やるとすれば、IDropTargetを差し替えることですが、本当にできるのか?、問題ないのか?といった疑問がありますし、ヘタに触ると不安定になりそうで怖いものです。

    WebBrowserコントロールがその差し替える機能を提供していないので、ネイティブに近いコードを書かざる得ない可能性もあります。

    2008年7月1日 14:22
    モデレータ
  •  Azulean さんからの引用

    正直なところ、お薦めできません。別の道を模索した方がいいような気がします。
    実現できたとしても、かなりの苦労を要すると推察されるためです。


    msdn のドキュメントを見るとコントロール自体で提供していない、となってい
    るので、何らかの意図があるのでしょう。


    漠然と、セキュリティ対策かな?と思いました。html には javascript などが
    含まれているので、その実行環境たる WebBrowser コントロールにドラッグす
    ると、実行し始めちゃんじゃないかと。

    # やったことないので真相は不明。


     Azulean さんからの引用

    ネイティブの話ですが、OLE D&D は IDropTarget インターフェースを実装した
    クラスのインスタンスを RegisterDragDrop 関数で登録することで実現されて
    います。


    ここは皆目分かりませんが、面倒だという風に受け止めました。


    私はふと思った程度なので、行動に移すつもりはありませんが、本件の投稿者
    はどうなんでしょう。

     

     

    どうしても、というのなら、AIR を検討した方がいいかもしれません。

    私がフォーラムに初めて質問した内容は AIR 絡みでした。

     

     

    2008年7月1日 14:55
  • 最終的にファイルを WebBrowserコントロールにドロップ出来れば良いのですよね?

    ならばちょっと視点を変えてこんなのはどうでしょう。(以下C#)

     

    void foo()

    {

       this.webBrowser1.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
    }

     

    void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {

       // e.Url にドロップされたファイルのパスが入っている。

     //  しかしそのままではブラウザコントロールが反応してしまうので、
     // 適切に判断して e.Cancel = true; で制御する。
    }

     

    ・・・・ 一番楽で確実なのはこれかと。 単に動作としてD&Dが出来ればいいのなら。

    ただし当然ですが、自分で Navigate(String) した際にも反応しますので、そこの判断は別途必要です。

    フラグ立てて切り分けるとか。

     

    もしも他に方法が無いなら、試してみて下さい。

    2008年7月5日 12:25
  • こんにちは。中川俊輔 です。

     

    皆様、回答ありがとうございます。

     

    koma31さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    勝手ながら有用な情報と思われる回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    koma31さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年7月18日 9:57