ドラッグ&ドロップで特殊フォルダを判断するには?


マルム  2005-11-16 07:23:48  No: 127770

OLEDragDropにて、ファイルやフォルダなど、ドラッグ&ドロップすると
Data.GetFormat(vbCFFiles)で、あればパスを取得することが出来ます。

この動作で、ゴミ箱、マイコンピュータ、マイドキュメントなどの
特殊フォルダをドラッグしたとき、ゴミ箱がドラッグされた・・・
マイコンピュータがドラッグされた・・・など分かる方法がわかりません。

なにをしたいかと言いますと・・・
今、ファイルやフォルダをリストビューへドラッグされたらその、
フォルダ名、ファイル名とアイコンを表示するようになっています。
ゴミ箱をドラッグすれば、ゴミ箱と表示してゴミ箱のアイコンを表示するようにしたいのです。
ゴミ箱のアイコン表示方法は分かるのですが、ゴミ箱がドラッグされたという判断方法が分かりません。
分かる方教えていただきたいです。


K.J.K.  2005-11-16 17:58:01  No: 127771

とりあえず、API関数のRegisterClipboardFormatに、
"Shell IDList Array"か"Shell Object Offsets"辺りを
渡して、その戻り値を使ってみては。
# 後はMSDNで調べましょう。
# "Transferring Shell Objects with Drag-and-Drop and the Clipboard"
# 辺りに詳細が書いてあります。


マルム  2005-11-18 07:00:43  No: 127772

ご返答ありがとうございます
RegisterClipboardFormatの"Shell IDList Array"などに
ついて調べて見ました。(^_^;)
MSDNで見たのですが、なんせ、英語はまったくダメなので
さっぱりでした(^_^;;;;;)
プログラムを見るのは、なんとか英語サイトでも全然問題ないのですが・・・
当たり前か・・・
ただ、見ていてなんとなくですが調べているところに有っていることが
書いてある事が分かります・・・ほんと意味が分かりたい!!って感じでした。
今、自力で、OLEDragDrop のイベント中での
Data.GetFormatを調べて・・・
XPだと    Data.GetFormat(-16268)
2000だと  Data.GetFormat(-16237)
の戻り値が、Trueになることが分かり・・・
XPの場合、Data.GetData(-16268)
2000の場合、Data.GetData(-16237)
で、取得したデータだと、こみ箱、マイコンピュータ、マイドキュメントなど
判定が可能で、なんとなくですが、自己解決しています。
だた、、、Data.GetData(-16237)などで、取得したデータがどんな構造体のデータが分からず、適当にBYTEデータに取得して判定していますので
すごい危険だと思っています。
上記、Data.GetData(-16237)などで取得したデータは、、
ごみ箱だと・・・{645FF040-5081-101B-9F08-00AA002F954E}に、、かなり近いデータだったので・・・
大丈夫かなと思っていたりしています。。。(^_^;)
こんな、初心者です。
K.J.K. さんのご指導していただいた、RegisterClipboardFormatの
"Shell IDList Array"か"Shell Object Offsets" が、どんなものか知りたいと思いつつ、上記判定で危険な形で完成しています。
これでも大丈夫でなのしょうか?


K.J.K.  2005-11-18 09:52:41  No: 127773

Private Declare Function RegisterClipboardFormat _
    Lib "user32.dll" Alias "RegisterClipboardFormatA" _
(ByVal FormatName As String) As Long

' ...

Dim cfShellIDListArray As Integer
Dim iResult As Long

iResult = RegisterClipboardFormat("Shell IDList Array")
cfShellIDListArray = CInt(&HFFFF0000 Or iResult)

とでもして、
Data.GetFormat(cfShellIDListArray)
をチェックしてみては。

しかし、MSDNの上記の文章を読み進めない限り、実データを
取得するのは難しいのでは。Data.GetDataの戻り値を解析
できませんよね?


K.J.K.  2005-11-18 22:15:23  No: 127774

ちなみに、中身は
CIDA ITEMIDLIST ITEMIDLIST ... ITEMIDLIST
のような構造です。


マルム  2005-11-19 08:58:47  No: 127775

サンプルありがとうございます。

なるほど・・・
> Dim cfShellIDListArray As Integer
> Dim iResult As Long
> iResult = RegisterClipboardFormat("Shell IDList Array")
> cfShellIDListArray = CInt(&HFFFF0000 Or iResult)
で、取得した、cfShellIDListArrayが、、
XPだと-16268になり、2000だと-16237
という値に!?
Format IDListってことになるんですね。

> Data.GetData(cfShellIDListArray)
で、取得したデータが、、
ごみ箱では、{645FF040-5081-101B-9F08-00AA002F954E}に近いと言いましたが
・・・ITEMIDLIST で、そのものだったのですね。(^_^;)
ごみ箱、マイドキュメント、マイコンピュータなどは
CIDA ITEMIDLISTで終わっていて
コントロールパネルや、コントロールパネル内のアイテムだと
CIDA ITEMIDLIST ITEMIDLIST ...と言う感じのデータだと分かりました。
でも、このCIDA や、ITEMIDLIST を取得する方法を探して見ましたが
C関係ばかり・・・・
MSDNにて
    '#define GetPIDLFolder(pida) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[0])
    '#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])
これだ!って思ってますが、、(・・。)ん?って感じです。
もしかして、 byte数や、offsetを利用して、CIDA ITEMIDLIST の取得は、自分でプログラムを作成して
取得するものですか?


K.J.K.  2005-11-19 18:25:51  No: 127776

> ・・・ITEMIDLIST で、そのものだったのですね。(^_^;)
> ごみ箱、マイドキュメント、マイコンピュータなどは
> CIDA ITEMIDLISTで終わっていて

だからこそ、まず英語だからと言っても臆せずにMSDNを読み進めて
下さい。きちんと探せばほぼ全部記述がありますし。

> もしかして、 byte数や、offsetを利用して、CIDA ITEMIDLIST の
> 取得は、自分でプログラムを作成して取得するものですか?

勿論そうです。当然MSDNを読んでフォーマットを良く調べてください。
そうすれば取得したITEMIDLISTに対してどういう処理をして、
どのような操作に繋げられるのかもわかるようになりますので。


マルム  2005-11-19 21:04:01  No: 127777

> だからこそ、まず英語だからと言っても臆せずにMSDNを読み進めて
> 下さい。きちんと探せばほぼ全部記述がありますし。

厳しいです・・・
ここはVB初心者掲示板ですよね。
英語のページを見ればわかると言われても。
読めないので全然わかりません。
※極端な例だと、質問に対して、アラビヤ語のページに
  書いてあるからそこを見てください。
  って言われているみたいなものです。(極端な例ですみません)
  見ても分からないものは分からないです。
私は、英語の質問してるのではなくVBの質問です。
VBで、こうやればできるよとわかってらっしゃるのでしたら
どうか教えていただきたいです。

K.J.K.さんは人に、たよるだけでなく「調べる力」を付けるためにも
と思って、書いて下さっていると思います。
その辺はわかっています。(どうか、ご機嫌を悪くしないで下さい)

ここの掲示板に記入したのは、散々調べた結果記入させていただいてます。
プログラムを作成する上で、英語はかなり必要だと思います。
しかし、API関係でMSDNの日本語版を見ても、よく分からない場合が
多いのに、MSDNの英語のページだと英語を直訳などし、さらに分からないはめになります。
今の私が作ろうとしているのは、かなりハードルが高かったようですね
(>_<")


ガッ  2005-11-19 21:14:25  No: 127778

かわいそうですねぇ…言葉が分からない理由で開発を断念せざるを得ないとは。
実際、
> 散々調べた結果記入させていただいてます
散々お調べに成られたのに、
> 読めないので全然わかりません
全然分からないなんて、酷すぎます(>_<

とりあえず、何かの助けになると思いますので、
機械翻訳サイトを置いておきますね。
http://www.google.co.jp/language_tools?hl=ja
http://www.excite.co.jp/world/


我龍院忠太  2005-11-19 22:46:56  No: 127779

ガッさんお勧めのサイト(googleの方)?で
「Transferring Shell Objects with Drag-and-Drop and the Clipboard」
を翻訳させて見ましたら、
「移動の貝は引張と低下とクリップボードによって反対する」
と出ました、Objectsを動詞だと思ってる、だけどObjects withなんて構文は
無いだろうに、どうしようも無いな、だめだこりゃ。(^^;
まあ中学3年の英語力があれば十分なのだが、英語は国際語なのだから
アラビヤ語とは全く違うよね。プログラミングには英語は必須。


K.J.K.  2005-11-20 05:34:42  No: 127780

> 英語のページを見ればわかると言われても。
> 読めないので全然わかりません。

と、自分で決め付けてしまうのは勿体無いと思います。
MSDNなどを読めというのは、やはりそれだけしっかりと
書いてあるからですよ。その原典を読ませずに私が私的に
咀嚼した物を与えたら、可能性を狭めてしまうでしょう。

もう1つは、そういう原典にあたる姿勢を持った上で、
(会話)言語的に理解しようとせず、実際に手を動かして
確認する、ということでしょうか。

MSDNでCIDAを調べればわかりますが、構造は非常に単純な
ものです。わからない単語があっても辞書をひきながら
調べれば十分に理解ができるものであると思われます。
# ちなみに、私は自動翻訳を使わず、手元に置いた辞書を
# ひきながら英文で書かれた情報を調べています。

ITEMIDLISTは、多少複雑ですが、海外サイトでその処理
(結合や変換など)をVBで行っているサンプルが結構あります。
ですが、コードをいきなり見るよりは、ITEMIDLISTの構造や
何故そのようになっているのか、をきちんと読んでから実際
に触れてみる方が、はるかに多くのことが学べるでしょう。

Windows 95以降のShellの仕組み、目指したもの、などが
おぼろげながらもつかめるようになるからです。

で、もし日本語で記述されたものをGoogleなどで調べた、
というのならば、私のサイトにあるサンプルで何か見つけて
いません? CIDA + ITEMIDLISTの構造を作る側のサンプルを
昔公開した覚えがあります。
# 今となっては処理に甘いところがあるとは思いますが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加