DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OLEドラッグ&ドロップとWebBrowserコントロール

環境/言語:[VB6]
分類:[VB6以前]

こんにちは。はじめまして。
お知恵を拝借したく、質問投稿いたします。

●質問1
VB6にて、アプリケーションウィンドウにドロップされたファイルを処理する(開く)、というよくある動作をさせようとしています。
このウィンドウ(フォーム)上の「どこにドロップされても」同じ特定の処理をさせたいのですが、フォーム上に配置された各コントロールにドロップされると、それぞれのOLEDragDropイベントが発生し、イベントバブルされないので、いちいち各コントロールのOLEDragDropイベントプロシージャの中にCall Form_OLEDragDrop(…とパイプのような処理を入れて対処しています。
この方法では、フォーム上のすべてのコントロールに施すことになり、あまりスマートではない気がして、もっと良い方法があるのでは、と思い調べてみたのですが見つかりませんでした。
このケースはとても多いと思うのですが、皆さん常套手段などあるのでしょうか。良い策がありましたらお教えください。

●質問2
関連して、このフォームに配置したWebBrowserコントロールにドロップされた場合、VB側でイベントをトリガする方法をご存知でしたらお教えください。つまり、WebBrowserコントロールにファイルがドロップされると、WebBrowserコントロール単独の動作でファイルを開こうとしたりなど動作してしまいます。BeforeNavigate2イベントをトリガすることはできますが、OLEドラッグ&ドロップのようにドロップされたものを細かく調べることが出来ません(複数ファイルがドロップされた場合など)。

よくある処理に思えたのですが、皆さんはどのようにしているのでしょう。Win32APIを使えば解決するのでしょうか。
誠に不躾ですが、どうぞよろしくお願いいたします。
こんにちは、田島さん。ピラルクです。

ちょっとトライしてみましたが、まずいきなりHWNDでエラー(^^;
WebBrowserのWindow階層は複雑みたいでこれは面倒かも。。。

> 質問1
わかりません。
(が、想像の付く範囲でコメントするなら...)
・Contorlをスキャンしてサブクラス化しHookする
・PeekMessageで横取りする
・何かのEventでDrop直前を検知しTargetをその瞬間DisableしFormへ渡す
とかがあるかもしれませんが、フォーム上のすべて
のコントロールに施す方が良さそうです。

> 質問2
DragQueryFile APIあたりを調べてみてください。
(私もよく確認していないので、できるかどうか知りませんが)
ピラルクさん

こんにちは。お返事ありがとうございます。

私もまずWebBrowserのハンドル関係で壁にあたりました…
で、結局、質問投稿にも書きましたが、おっしゃるようにサブクラス化してなんとか実現は出来ました。
要件は、とにかくフォーム上のどこでも(WebBrowser上もそれ以外も)ドロップされたファイルを取得することだったので、フォーム上のWebBrowserを含むコントロールのドロップイベントを無効にして、フォームのドロップをサブクラス化しました。
あまりスマートではない気もしますが…。

どうも解せないのは、この処理(ドロップファイルを開く)は多くのアプリで使われると思うのですが、こんな面倒(というほどでもないですが)な方法で皆さん解決してるのかな?というところです。
しかもWeb上に情報もサンプルもほとんど見あたりませんでした。

あとはIDocHostUIHandlerをImplementsして…、という方法かもしれませんが、このあたり勉強不足でして…。

どなたか情報や経験をお持ちならお願いします。
こんにちは、田島さん。ピラルクです。

ハンドルが取れないのは、
「これを使って何かしようと思うなよ!」という
メッセージだったりして……。(と脅かしてみる(^^;)

> こんな面倒(というほどでもないですが)な方法で皆さん解決してるのかな?

エクスプローラスタイル的な画面なら、そう多く
もないし、コントロールの多い画面なら、Dropの
受け手も複数になる可能性が高くなり、画面全体
で取ることはなくなる、というのもあるかも。

それより、サブクラス化のほうが面倒という気が。。。

DOBON.NET | プログラミング道 | プログラミング掲示板