デスクトップ上にドロップ (VB6)

解決


しろき  2009-12-18 17:00:50  No: 102137  IP: 192.*.*.*

デスクトップ上にドロップする方法について、どなたかご教示ください。
環境はWin2000、VB6 SP6です。

(1)デスクトップ上にForm1があります。Form1のサイズはデスクトップより小さいものです。
(2)Form1にはLabel1があります。Label1には、特定のファイル(ABC.doc)の絶対パスが表示されています。

この状況で行いたい動作としては、
(1)Label1に表示されている(絶対パスの)文字列をデスクトップ上にドラッグ&ドロップして、
(2)デスクトップ上にこのファイル(ABC.doc)のコピーを作る。
という動作です。

要は、「デスクトップ上にドロップされた」というイベントの取得方法が分からないのです。
よろしくお願いします。

編集 削除
オショウ  2009-12-18 17:23:37  No: 102138  IP: 192.*.*.*

ドロップされたと言うイベントを受け取るプログラムは
何か解れば解決の糸口になると思いますが・・・

この場合、受け取るものはデスクトップ(EXPLORER)に
なるはずです。

EXPLORERがどう判断して意図するような処理を行うかは
ドラッグした段階で情報をちゃんと作れれば、そのよう
な結果になるかと・・・

そうでない場合、VB6でデスクトップのイベントをフック
して処理を代行する機能を作ることになりますが、そう
言うことを行うプログラムを作りたいと言うことですか?

VB6でデスクトップへのイベントをフックするプログラム
は多分、作れないかと・・・

SetWindowsHookExを使うことになるでしょうし・・・
その機能を代行する関数は、DLLで提供しないといけない
はずだし・・・

C言語で作るなら、可能です。

以上。参考まで

編集 削除
魔界の仮面弁士  2009-12-18 17:43:07  No: 102139  IP: 192.*.*.*

ドロップ処理の前に、まずはクリップボード操作を思い浮かべてみてください。

たとえば、ブラウザに表示された文字列をコピーした場合、それを
メモ帳に貼り付ける事はできますが、ペイントに貼る事はできませんよね。
一方、画像をコピーした場合には、メモ帳には貼れず、ペイントには貼れます。

これは、メモ帳がテキストデータのみを受け取り、ペイントは画像データのみを
受け取るからです。Word や Excel などは、どちらのデータに対応していますね。

つまり、送信側と受信側の両方が対応する形式のデータを用意しないと
いけないということです。

もうひとつ重要なのは、この時、貼り付け処理を実際に担当するのは、
コピー先のアプリケーションであるという事です。コピー元のアプリが、
コピー先を制御するわけではありません。コピー元はデータを渡すだけです。



OLEドラッグ & ドロップの場合も同様です。

送信側(今回はVB)は、ドラッグ用のデータを提供はしますが、
そのデータを実際に取り扱うのは、通常、ドロップ先のアプリです。

詳細については、下記を参照してみてください。
http://msdn.microsoft.com/ja-jp/library/cc482733.aspx


> (1)Label1に表示されている(絶対パスの)文字列をデスクトップ上にドラッグ&ドロップして、
まず、デスクトップは「文字列」を受け取れません。
しかし「ファイル」を受け取る事ならばできます。

そのデータを用意することから始めましょう。

Private Sub Label1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
    'DataObjectに、ファイル形式のデータを登録する
    Data.Files.Add Label1.Caption
    Data.SetData , vbCFFiles

    'このデータをコピーおよび移動して良い事を通知します
    AllowedEffects = vbDropEffectCopy Or vbDropEffectMove
End Sub

記述するのはこれだけです。
あとは、Label1.OLEDrag を呼び出せばドラッグ処理が開始されます。



> (2)デスクトップ上にこのファイル(ABC.doc)のコピーを作る。
コピー作業はデスクトップ側が担当しますので、VB 側では何も行いません。

AllowedEffects で Copy と Move を指定した場合には、デスクトップ側で
「Ctrl キーを押していればコピー、さもなくば移動」として扱ってくれます。

Copy のみ(あるいは Move のみ)を指定した場合には、Ctrl/Shift 等の
キー押下に関係なく、常にコピー(あるいは移動)してくれます。

編集 削除
しろき  2009-12-18 18:09:31  No: 102140  IP: 192.*.*.*

オショウ 様
>この場合、受け取るものはデスクトップ(EXPLORER)になるはずです。
これに気が付きませんでした。ヒントを有難うございました。

魔界の仮面弁士 様
詳しい解説を頂き、有難うございました。

お陰で解決できそうです。
お二方、どうも有難うございました。

編集 削除