ListViewにマイドキュメントのアイコンを表示したいのですが
SHGetSpecialFolderLocation(Handle, CSIDL_PERSONAL, PIDL);
SHGetFileInfo(PChar(PIDL),0,SHFileInfo,SizeOf(SHFileInfo),Flags);
ImageIndex := SHFileInfo.iIcon;
のような形で取得しても普通のフォルダアイコンになってしまいます。
どうすればエクスプローラで見えるようなアイコンを取得できるので
しょうか?
おそらくお望みの答えではないのですが
C:\WINDOWS\system32\SHELL32.DLL
にアイコンがたくさんはいっていて
235番目のものがマイドキュメントのアイコンになるようです。
環境はWinXPです
私もおそらく、お望みの答えではないのですが、レジストリを全て走査してきました。(スゲー時間かかりました)。
で、みつけたものは、、、
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 です、、、と補足
ふとやってみたんですが、私はこの方法(↓)で取得できますが、、、
----------------------------------------------------------
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 です。
通りすがってちょっと調べた
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;
SHGetFileInfo関数を使う方法は、Win2000では ×
MyDocs.dllファイルから抽出する方法は、Win2000でも ○
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
から取得しましょう。
# 窓の手はこちらを書き換えていました
みなさん、ありがとうございます。
イメージハンドルやレジストリを利用すればいいというのは
分かったのですが、そこからイメージインデックスに変換するのは
どうすればよいのでしょうか?
たびたびすいません…よろしくお願いします。
ListViewのイメージインデックスということは、多分、ImageListを使ってるんですよね?
なら、関連付けられているImageListに対して、
var
ico : TIcon;
indx: integer;
{
icoに頑張って入れたいアイコンを取得
}
indx := ImageList1.AddIcon(ico);
で、indxに加えたアイコンのインデックスが入りますから、それをListViewのItemのImageに設定するだけです。つまぁり、
ImageIndex := ImageList1.AddIcon(ico);
みたいな・・・。
ツイート | ![]() |