VB2005、XPで作成しています。
PC内のフォルダツリーを作成しています。
デスクトップがルートノードになるようにしようとしています。
このときですが、
マイコンピュータ
マイドキュメント
マイネットワーク
ごみ箱
がノードとして作成されません。
TreeView1.Nodes.Add(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop))
により取得したフォルダ直下にはないので作成されないのは当然ですが、
作成する方法として何か良い方法があれば教えてください。よろしくお願いします。
正攻法でやるとなると、API を使うしかないです。それなりに面倒ですよ。
とりあえず、下記に C# 製の ExplorerTreeView のサンプルがあります。
イベントが無いなど、細かい点は未実装ですが、処理のイメージは掴めるかと。
http://www.codeproject.com/cs/miscctrl/ExplorerTreeView.asp
魔界の仮面弁士さんありがとうございます。
C#製のサンプル、大変参考になります。
ただ、難しいですね(^^;。
その後もいろいろと他のサンプルを見ていますが、つまっています。
SHGetSpecialFolderLocation(Me.Handle, CSIDL_DESKTOP, pid)
でポインタを取得し、
SHGetFileInfo(pid, 0, SHFI, Marshal.SizeOf(SHFI), SHGFI_DISPLAYNAME Or SHGFI_ICON)
で情報を取得しようとしていますが、
ポインタは取得するものの、情報は取得できません。
なぜでしょうか??
名前だけが得られれば良いのなら、
Shell オブジェクトの NameSpace メソッド
http://msdn2.microsoft.com/en-us/library/ms630423.aspx
から Folder オブジェクトを得て、FolderItem を列挙する手法もあります。
(COM オブジェクトなので Marshal.RelaseComObject を忘れずに)
> ポインタは取得するものの、情報は取得できません。
> なぜでしょうか??
情報が断片的なので、これだけだと判断しにくいです。
取得部分までのコードを単純化して、第三者がすぐに試せるような
コードにして提示できますでしょうか?
魔界の仮面弁士さんまたまたありがとうございます。
C#製のサンプルがまさに作成したいものでありますので名前だけでは困ります(^^;。
http://www.atmarkit.co.jp/fdotnet/dotnettips/280getappicon/getappicon.html
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200408/04080055.txt
この2つのコードを参考にしています。
そんな状況での下記のコードになります。
Dim SHFI As New SHFILEINFO()
Dim pid As IntPtr
ret = SHGetSpecialFolderLocation(Me.Handle, CSIDL_DESKTOP, pid)
ret = SHGetFileInfo(pid, 0, SHFI, Marshal.SizeOf(SHFI), SHGFI_DISPLAYNAME Or SHGFI_ICON)
いかがでしょうか??
> いかがでしょうか??
正直なところ、これでもまだ、情報が断片的すぎます。
API 宣言も無ければ、戻り値や Err.LastDllError の結果も記載されていませんし、
「情報は取得できません」という状況の具体的な様子も説明が無いですよね。
正しく記述すれば、正しく取得されるであって、それが上手くいかない場合、
まずはコードを疑わねばならないのですが……提示されたコードでは、
>>> 第三者がすぐに試せるような
の状態になっていませんので、判断に困ります。
> なぜでしょうか??
> いかがでしょうか??
うまくいかなり理由が必要についての説明が必要なのであれば、
ByVal/ByRef の間違い、型指定のミス、属性指定の漏れなども含めて
確認が必要なので、「動作させられるコード」を提示してください。m(_ _)m
とりあえず、提示されたコードだけで言えば……
・API 宣言/構造体宣言などは適切か?
(たとえば、関数側が W タイプで、構造体側が A タイプだったりはしないか?)
> ret = SHGetSpecialFolderLocation(Me.Handle, CSIDL_DESKTOP, pid)
・これは成功しているのか? (正常時は 0 を返すはず)
> ret = SHGetFileInfo(pid, 0, SHFI, Marshal.SizeOf(SHFI), SHGFI_DISPLAYNAME Or SHGFI_ICON)
・Marshal.SizeOf は、正しい値を返しているのか?
(SHFILEINFOA なら 352、SHFILEINFOW なら 692 になるはず)
# あぁ、回答が微妙に変な日本語になってる。。。まぁいいか。
VB2005 での実装の参考になるかどうかわかりませんが、
VB6 版のサンプルを載せておきます。
http://btmtz.mvps.org/index.html
見るべきは、[VBExplorer] や [VBTreeView]のあたり。
魔界の仮面弁士さん
いろいろとアドバイスありがとうございます。
なんとか自分で作成することができました(^^)。
C#製のサンプル、ほんとうに助かりました。
また投稿すると思いますが、今後ともよろしくお願いいたしますm(__)m。
ツイート | ![]() |