「マイ ドキュメント」アイコンのイメージインデックスの取得


サラ  2005-02-08 10:21:37  No: 13112

ListViewにマイドキュメントのアイコンを表示したいのですが

SHGetSpecialFolderLocation(Handle, CSIDL_PERSONAL, PIDL);
SHGetFileInfo(PChar(PIDL),0,SHFileInfo,SizeOf(SHFileInfo),Flags);
ImageIndex  := SHFileInfo.iIcon;

のような形で取得しても普通のフォルダアイコンになってしまいます。
どうすればエクスプローラで見えるようなアイコンを取得できるので
しょうか?


Fusa  2005-02-09 09:59:12  No: 13113

おそらくお望みの答えではないのですが
C:\WINDOWS\system32\SHELL32.DLL
にアイコンがたくさんはいっていて
235番目のものがマイドキュメントのアイコンになるようです。

環境はWinXPです


通りすがってちょっと調べた  2005-02-09 11:37:57  No: 13114

私もおそらく、お望みの答えではないのですが、レジストリを全て走査してきました。(スゲー時間かかりました)。

で、みつけたものは、、、
HKEY_USERS\S-1-5-21-57989841-1957994488-1708537768-1014\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\DefaultIcon
なるキーにある値で
%SystemRoot%\SYSTEM32\mydocs.dll,0
ものでし。
というわけで、C:\WINDOWS\SYSTEM32\mydocs.dllの0番目のアイコンを調べたら、ああ、確かにマイドキュメントのアイコンだわ。。。

ただ、こんなキーが全PC、また全OSにあるのか不明です。絶対にFusa さんの方法の方が確実です。

とりあえず、winXP Pro SP2 です、、、と補足


通りすがってちょっと調べた(連続投稿でス  2005-02-09 11:56:01  No: 13115

ふとやってみたんですが、私はこの方法(↓)で取得できますが、、、
----------------------------------------------------------
uses 
  ShellAPI, ShlObj;

procedure うりゃぁぁぁぁぁ!!!(TObjcet Sender?);
 var
   SH  : SHFILEINFO;
   PID : PItemIDList;
   Path: array[0..MAX_PATH-1] of Char;
begin
  SHGetSpecialFolderLocation(Application.Handle, CSIDL_PERSONAL, PID);
  SHGetFileInfo(PChar(PID),0,SH,SizeOf(SH),SHGFI_PIDL or SHGFI_ICON or SHGFI_LARGEICON or SHGFI_DISPLAYNAME);
  Image1.Picture.Icon.Handle := SH.hIcon;
end;
----------------------------------------------------------

無論、winXP Pro SP2 です。


通りすがりの」  2005-02-09 14:45:16  No: 13116

通りすがってちょっと調べた

procedure TForm1.Button1Click(Sender: TObject);
var
  szPath: array[0..MAX_PATH]of Char;
begin
  GetSystemDirectory(szPath, Sizeof(szPath));
  StrCat(szPath, '\MyDocs.dll');
  Image7.Picture.Icon.Handle := ExtractIcon(Handle, szPath, 0);
end;


passerby  2005-02-09 15:00:14  No: 13117

SHGetFileInfo関数を使う方法は、Win2000では ×
MyDocs.dllファイルから抽出する方法は、Win2000でも ○


にしの  2005-02-10 02:14:18  No: 13118

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\DefaultIcon
でよろしいかと。
窓の手でマイドキュメントのアイコンを変更すると、このキーが消されてしまいます。
もしこのキーがなければ、デフォルトの
HKEY_CLASSES_ROOT\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\DefaultIcon
から取得しましょう。
# 窓の手はこちらを書き換えていました


サラ  2005-02-11 05:43:03  No: 13119

みなさん、ありがとうございます。

イメージハンドルやレジストリを利用すればいいというのは
分かったのですが、そこからイメージインデックスに変換するのは
どうすればよいのでしょうか?

たびたびすいません…よろしくお願いします。


とおりすが〜りぃ  2005-02-11 07:51:57  No: 13120

ListViewのイメージインデックスということは、多分、ImageListを使ってるんですよね?
なら、関連付けられているImageListに対して、
 var
   ico : TIcon;
   indx: integer;
{
icoに頑張って入れたいアイコンを取得
}
indx := ImageList1.AddIcon(ico);
で、indxに加えたアイコンのインデックスが入りますから、それをListViewのItemのImageに設定するだけです。つまぁり、
ImageIndex := ImageList1.AddIcon(ico);
みたいな・・・。


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

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






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