2012-01-28 11 views
1

下記のAPIを使用して、ファイルシステムのドライブ、フォルダ、ファイルのアイコンを正常に抽出できます。私がこれまでに得たDLLインポートなどの追加情報は、hereで見つけることができます。メソッドGetExtraLargeIconForFolderを呼び出すと、アイコン内に48x48サイズのイメージが表示されます。SHGetImageListで使用するデスクトップとネットワークのアイコンインデックスはどのようにして決定できますか?

public enum ImageListIconSize : int 
{ 
    Large = 0x0, 
    Small = 0x1, 
    ExtraLarge = 0x2, 
    Jumbo = 0x4 
} 

private static IImageList GetSystemImageListHandle(ImageListIconSize size) 
{ 
    IImageList iImageList; 
    Guid imageListGuid = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950"); 
    int ret = SHGetImageList(
     (int)size, 
     ref imageListGuid, 
     out iImageList 
     ); 
    return iImageList; 
} 

public static Icon GetExtraLargeIconForFolder(string path) 
{ 
    SHFILEINFO shinfo = new SHFILEINFO(); 
    IntPtr retVal = SHGetFileInfo(
     path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), 
     (int)(SHGetFileInfoConstants.SHGFI_SYSICONINDEX | 
       SHGetFileInfoConstants.SHGFI_ICON)); 

    int iconIndex = shinfo.iIcon; 
    IImageList iImageList = 
     (IImageList)GetSystemImageListHandle(ImageListIconSize.ExtraLarge); 
    IntPtr hIcon = IntPtr.Zero; 
    if (iImageList != null) 
    { 
     iImageList.GetIcon(iconIndex, 
      (int)ImageListDrawItemConstants.ILD_TRANSPARENT, ref hIcon); 
    } 

    Icon icon = null; 
    if (hIcon != IntPtr.Zero) 
    { 
     icon = Icon.FromHandle(hIcon).Clone() as Icon; 
     DestroyIcon(shinfo.hIcon); 
    } 
    return icon; 
} 

Windowsエクスプローラでは、デスクトップ、ネットワーク、コンピュータのアイコンが表示されます。これらのファイルシステムノードに正しいアイコンインデックスを取得するにはどうすればよいですか?

答えて

3

あなたはほぼそこにいます。 SHGetFileInfoを使用しますが、flagsパラメータにSHGFI_PIDLを渡す必要があります。

次に、パスではなくPIDLを渡して、対象のシェルオブジェクトを指定する必要があります。 SHGetSpecialFolderLocationに電話をかけてPIDLを取得します。 CSIDLの値をこのルーチンに渡します。 CSIDL_DESKTOP,CSIDL_DRIVES,CSIDL_NETWORKなど

+0

CSIDLを渡す方法は?私はそれを文字列またはShell32.CSIDLのように渡しますか?それも初期化されていない –

+0

@MurHafSoz私はコメントでそれに答えることはできません。あなたがSHGetSpecialFolderLocationにピンボケしようとしているのに気づいているようです。あなたがそれを解決できない場合は、それについての質問をしてください。 –

関連する問題