デスクトップ上にドロップする方法について、どなたかご教示ください。
環境はWin2000、VB6 SP6です。
(1)デスクトップ上にForm1があります。Form1のサイズはデスクトップより小さいものです。
(2)Form1にはLabel1があります。Label1には、特定のファイル(ABC.doc)の絶対パスが表示されています。
この状況で行いたい動作としては、
(1)Label1に表示されている(絶対パスの)文字列をデスクトップ上にドラッグ&ドロップして、
(2)デスクトップ上にこのファイル(ABC.doc)のコピーを作る。
という動作です。
要は、「デスクトップ上にドロップされた」というイベントの取得方法が分からないのです。
よろしくお願いします。
ドロップされたと言うイベントを受け取るプログラムは
何か解れば解決の糸口になると思いますが・・・
この場合、受け取るものはデスクトップ(EXPLORER)に
なるはずです。
EXPLORERがどう判断して意図するような処理を行うかは
ドラッグした段階で情報をちゃんと作れれば、そのよう
な結果になるかと・・・
そうでない場合、VB6でデスクトップのイベントをフック
して処理を代行する機能を作ることになりますが、そう
言うことを行うプログラムを作りたいと言うことですか?
VB6でデスクトップへのイベントをフックするプログラム
は多分、作れないかと・・・
SetWindowsHookExを使うことになるでしょうし・・・
その機能を代行する関数は、DLLで提供しないといけない
はずだし・・・
C言語で作るなら、可能です。
以上。参考まで
ドロップ処理の前に、まずはクリップボード操作を思い浮かべてみてください。
たとえば、ブラウザに表示された文字列をコピーした場合、それを
メモ帳に貼り付ける事はできますが、ペイントに貼る事はできませんよね。
一方、画像をコピーした場合には、メモ帳には貼れず、ペイントには貼れます。
これは、メモ帳がテキストデータのみを受け取り、ペイントは画像データのみを
受け取るからです。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 等の
キー押下に関係なく、常にコピー(あるいは移動)してくれます。
オショウ 様
>この場合、受け取るものはデスクトップ(EXPLORER)になるはずです。
これに気が付きませんでした。ヒントを有難うございました。
魔界の仮面弁士 様
詳しい解説を頂き、有難うございました。
お陰で解決できそうです。
お二方、どうも有難うございました。