none
ブラウザからのドラッグ&ドロップについて教えてください。 RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    ブラウザからのドラッグ&ドロップについて教えてください。
    string URL = @"http://google.co.jp/";
    public Form1()
    {
    InitializeComponent();
    webBrowser1.Url = new System.Uri(URL);
    }
    というだけのコードで、ドラッグ&ドロップをすでに実現しています。
    このドラッグ中のデータを取得するには、どうすればよいでしょう?
    たとえば、
    private void Form1_MouseLeave(object sender, EventArgs e)
    {
    DataObject data = sender as DataObject;
    string tmp = "";
    tmp = data.GetText();
    }
    とかやってみたのですが、キャストできませんでした。
    2011年1月21日 3:58

回答

  • このドラッグ中のデータを取得するには、どうすればよいでしょう?
    たとえば、
    private void Form1_MouseLeave(object sender, EventArgs e)
    {
    DataObject data = sender as DataObject;
    string tmp = "";
    tmp = data.GetText();
    }
    とかやってみたのですが、キャストできませんでした。

    sender には Form のインスタンスが入っていますので、さすがにそのようなキャストはできません。
    DOM 経由で WebBrowser 上で選択されている文字列を取得する必要があります。

     HtmlElement.DomElement プロパティ (System.Windows.Forms)
     http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.domelement.aspx

    次のようなコードで選択中の文字列は取得できます。(Microsoft.mshtml への参照設定と、using mshtml; の定義は必要です。)

          IHTMLDocument2 htmlDocument = webBrowser1.Document.DomDocument as IHTMLDocument2;
          if (htmlDocument != null)
          {
            IHTMLSelectionObject currentSelection = htmlDocument.selection;
            if (currentSelection != null)
            {
              IHTMLTxtRange range = currentSelection.createRange() as IHTMLTxtRange;
              if (range != null)
              {
                MessageBox.Show("選択された文字列=" + range.text);
              }
            }
          }
    
    

    あとは、Form の MouseLeave イベントではなくて、WebBrowser.Document.Body の DragXXXX 系のイベントをうまく利用すればいいはずです。
    • 回答としてマーク d-kot 2011年1月21日 9:36
    2011年1月21日 4:22

すべての返信

  • このドラッグ中のデータを取得するには、どうすればよいでしょう?
    たとえば、
    private void Form1_MouseLeave(object sender, EventArgs e)
    {
    DataObject data = sender as DataObject;
    string tmp = "";
    tmp = data.GetText();
    }
    とかやってみたのですが、キャストできませんでした。

    sender には Form のインスタンスが入っていますので、さすがにそのようなキャストはできません。
    DOM 経由で WebBrowser 上で選択されている文字列を取得する必要があります。

     HtmlElement.DomElement プロパティ (System.Windows.Forms)
     http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.domelement.aspx

    次のようなコードで選択中の文字列は取得できます。(Microsoft.mshtml への参照設定と、using mshtml; の定義は必要です。)

          IHTMLDocument2 htmlDocument = webBrowser1.Document.DomDocument as IHTMLDocument2;
          if (htmlDocument != null)
          {
            IHTMLSelectionObject currentSelection = htmlDocument.selection;
            if (currentSelection != null)
            {
              IHTMLTxtRange range = currentSelection.createRange() as IHTMLTxtRange;
              if (range != null)
              {
                MessageBox.Show("選択された文字列=" + range.text);
              }
            }
          }
    
    

    あとは、Form の MouseLeave イベントではなくて、WebBrowser.Document.Body の DragXXXX 系のイベントをうまく利用すればいいはずです。
    • 回答としてマーク d-kot 2011年1月21日 9:36
    2011年1月21日 4:22
  • totojoさん、ありがとうございます。
    mshtmlを追加するのはなんとかできて、取得もできました。

    あとわからないのが、以前にも話題に出ていた
    「Form の MouseLeave イベントではなくて、WebBrowser.Document.Body の DragXXXX 系のイベント」
    のところなのですが、
    このDocutent.Body.Drag***系のイベントって、
    どこでイベントハンドラを設定するんでしょう?

    ブラウザなのかな、と思ったのですが、
    ふと、
    webBrowser.Document.Body.Drag += new HtmlElementEventHandler(dragStart);
    とすればよいのかと思い至り、これで実現できました。
    大感謝。

    2011年1月21日 9:35