none
webBrowserコントロールから、文字列をドラッグ&ドロップして、他のアプリケーションにもっていきイベントを取得したい RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    webBrowserコントロールから、文字列をドラッグ&ドロップして、他のアプリケーションにもっていきたいと思っています。
    じつはなにもコードを書かなくても、単にwebBrowserを配置しておけば、それだけでドラッグ&ドロップできます。
    が、問題なのは、そのときのイベントを取得できないことです。
    イベントを取得したいです。

    webBrowserコントロールには、MouseDownなどのイベントがないので、代わりに、そのウィンドウのMouseLeaveで取得しようとしたのですが、イベントが起きません。

    Formのイベントハンドラで、MouseLeaveを設定して、
    private void Form_MouseLeave(object sender, EventArgs e){
     MessageBox.Show("マウスが離れました");
    }
    というだけのコードなのですが、どこに落とし穴があるのでしょう?

    2011年1月14日 12:39

回答

  • Form の MouseLeave イベントは、Form のクライアント領域を通過しないとイベントが発生しないようです。
    単純に WebBrowser を Form に貼り付けると WebBrowser の Dock プロパティが Fill になります。
    こうなると Form のクライアント領域が見えなくなってしまうため、Form の MouseLeave イベントが発生しないと思われます。
    WebBrowser の Dock を None とかにして、WebBrowser のサイズを Form より気持ち小さめにしてクライアント領域を(額縁みたいに)表示してやると、MouseLeave イベントは発生します。

    Document.Body の MouseLeave イベントで代用するというのはいかがでしょうか?次のようなイメージです。

    まずは WebBrowser の DocumentCompleted イベント ハンドラを登録します。
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
    

    次に DocumentCompleted イベントを実装します。この中で Document.Body の MouseLeave イベントを登録します。
    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
      webBrowser1.Document.Body.MouseLeave += new HtmlElementEventHandler(Body_MouseLeave);
    }
    

    あとは MouseLeave イベントを実装します。MouseDown イベントとかも取れます。
    • 回答としてマーク d-kot 2011年1月19日 9:02
    2011年1月17日 9:21

すべての返信

  • Form の MouseLeave イベントは、Form のクライアント領域を通過しないとイベントが発生しないようです。
    単純に WebBrowser を Form に貼り付けると WebBrowser の Dock プロパティが Fill になります。
    こうなると Form のクライアント領域が見えなくなってしまうため、Form の MouseLeave イベントが発生しないと思われます。
    WebBrowser の Dock を None とかにして、WebBrowser のサイズを Form より気持ち小さめにしてクライアント領域を(額縁みたいに)表示してやると、MouseLeave イベントは発生します。

    Document.Body の MouseLeave イベントで代用するというのはいかがでしょうか?次のようなイメージです。

    まずは WebBrowser の DocumentCompleted イベント ハンドラを登録します。
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
    

    次に DocumentCompleted イベントを実装します。この中で Document.Body の MouseLeave イベントを登録します。
    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
      webBrowser1.Document.Body.MouseLeave += new HtmlElementEventHandler(Body_MouseLeave);
    }
    

    あとは MouseLeave イベントを実装します。MouseDown イベントとかも取れます。
    • 回答としてマーク d-kot 2011年1月19日 9:02
    2011年1月17日 9:21
  • webBrowserコントロールから、文字列をドラッグ&ドロップして、他のアプリケーションにもっていきたいと思っています。じつはなにもコードを書かなくても、単にwebBrowserを配置しておけば、それだけでドラッグ&ドロップできます。が、問題なのは、そのときのイベントを取得できないことです。イベントを取得したいです。

    ということなので、Formのクライアント領域が隠れているからというわけではなくて、そもそもイベントが発生する状況ではないような気がします。

    また、ドラッグ&ドロップ中であれば Document.Body.MouseXXXXイベントも発生しないと思います。

    使うなら Document.Body.DragXXXX あたりでしょうか。

    2011年1月18日 7:00
  • # 説明不足だったようで...
    webBrowserコントロールから、文字列をドラッグ&ドロップして、他のアプリケーションにもっていきたいと思っています。じつはなにもコードを書かなくても、単にwebBrowserを配置しておけば、それだけでドラッグ&ドロップできます。が、問題なのは、そのときのイベントを取得できないことです。イベントを取得したいです。

    ということなので、Formのクライアント領域が隠れているからというわけではなくて、そもそもイベントが発生する状況ではないような気がします。


    Form のクライアント領域云々については「Form の MouseLeave イベントがなぜ発生しないか?」という点についてのレスです。
    Form の MouseLeave イベントの発生要因として、Form のクライアント領域が見えているかどうかは重要だと思いますので。(クライアント領域をすべてコントロールで覆ってしまうと、Mouse 関連のイベントは当然発生しませんよね。)

    また、ドラッグ&ドロップ中であれば Document.Body.MouseXXXXイベントも発生しないと思います。

    使うなら Document.Body.DragXXXX あたりでしょうか。


    こちらに関しては、その通りだと思います。
    2011年1月19日 4:52
  • totojoさん、コメントありがとうございます。
    4~5日ほどひとりで悩んでいました。
    おっしゃるとおりで、普通に(?)Webブラウザを配置すると、ウィンドウいっぱいになってしまうので、ひょっとしてそれが原因なのだろうか、でも、Formを出たときといっているんだから、ブラウザがいっぱいであろうがなかろうが、Formを出たときにはちがいないような気がする、と、やっと思い至ったところでした。
    解決案としては、額縁方式かな~と、ようやく試してみようと思ったところでした。

    で、もしやと思って、もう一度来てみたら、ご回答いただいていて、早速試したところ、これでうまくいきました!
    webBrowser1.Document.Body.MouseLeave += new HtmlElementEventHandler(Body_MouseLeave);
    なるほど。これはわたしには、ちょっととても思いつかなかったです。ありがとうございます。

    m.yoshinoさん、コメントありがとうございます。
    Document.Body.Mouse***でとりあえずうまくいったみたいです。
    Document.Body.Drag***も参考にします。
    ありがとうございました。

    2011年1月19日 9:02