アプリケーションからD&Dを受け入れたりするには?

解決


柚子  2010-04-13 17:18:22  No: 71545  IP: [192.*.*.*]

質問させて頂きます。

現在、他のアプリケーションからD&Dを受け入れたり
こちらのアプリケーションから、他のアプリケーションにD&Dする方法を調べています。

調べると、OLE主流との事で更に調べてみましたが
クラスを継承しなければ行けない等、とても面倒に感じています

今はこちらのアプリから、他のアプリにD&Dが一番行いたいのですが
OLEを使わずに済む、手軽な方法は無いでしょうか?

マウスキャプチャーで監視し、こちからWM_DROPFILESを発行すればとも思いましたが
他のアプリがタブ型で合ったりした場合、不都合が生じないかなど心配があります。

どうぞご教授の程よろしくお願いします。

編集 削除
仲澤@失業者  2010-04-13 19:19:01  No: 71546  IP: [192.*.*.*]

ドラッグ&ドロップで「ファイル」を受け渡せるようになったのは
Windows3.xのファィルマネージャが最初ですが、このときの実装が
OLEでした。従って、この方法が「ファイル」のドロップサーバー
を実現する最も簡素な方法となります。
下記のサンプルが役に立つかもしれません。

http://support.microsoft.com/kb/139067/ja

編集 削除
subaru  2010-04-14 16:47:45  No: 71547  IP: [192.*.*.*]

IDropSourceの実装を自分で用意しなければいけないのはどうしようもありませんが、
もし他のアプリにドロップしたいのがファイルだけなら
IDataObject は IShellFolder::GetUIObjectOf で得られます。

編集 削除
ロマ  2010-04-14 23:31:41  No: 71548  IP: [192.*.*.*]

Advanced Windowsの著者Jeffrey Richterは
WS_EX_ACCEPTFILESのウィンドウにドロップできるソース側の作り方を書いています。
("Windows 95:A Developer's Guide"の DFSrcDmというサンプルです)
原理は、マウスキャプチャーとWM_DROPFILESをターゲットに送るという方法です。

xpで試してみた結果、
メモ帳へのドロップはOK、エクスプローラへはNGでした。

つまり、汎用のD&Dが必要ならば、OLEが必要です。

ただし、データがプライベートなものという限定ならば、
WM_DROPFILESの代わりにオリジナルなメッセージを使えば出来そうです
(状態:DragEnter,DragLeave,Dropに伴うやり取りとカーソルの設定、
プロセス間でのデータのやり取り:アトム、MMF、WM_COPYDATAなどを利用)。

編集 削除
柚子  2010-04-16 15:53:02  No: 71549  IP: [192.*.*.*]

皆様レス有難うございます。

汎用性も重視している中で、WM_DROPFILESの発行等を考えていましたが
OLEが一番なのですね…
OLEを使い問題解決に図ります。
有難うございました。

編集 削除