- uses ShlObj, ShellApi, KnownFolders;
- {$R *.dfm}
- procedure TForm5.FormCreate(Sender: TObject);
- const iconSize : TSize = (cx : 16; cy:16);
- var cpItem, cpEntry : IShellItem;
- CPFolder : IShellFolder;
- DesktopFolder : IShellFolder;
- cpIDList, cpEntryID : PItemIDList;
- eidList : IEnumIDList;
- fetched : cardinal;
- cpDisplay : TStrRet;
- sif : IShellItemImageFactory;
- mi : TMenuItem;
- bmp : TBitmap;
- hbmp : HBITMAP;
- begin
- SHGetKnownFolderIDList(FOLDERID_ControlPanelFolder, 0, 0, cpIDList);
- SHGetDesktopFolder(DesktopFolder);
- DesktopFolder.BindToObject(cpIDList, nil, IID_IShellFolder, CPFolder);
- CPFolder.EnumObjects(handle, SHCONTF_FOLDERS + SHCONTF_NONFOLDERS, eIdList );
- while S_OK = eIdList.Next(1, cpEntryID, fetched) do begin
- CPFolder.GetDisplayNameOf(cpEntryID, SIGDN_NORMALDISPLAY, cpDisplay);
- SHCreateItemFromIDList(cpEntryId, IID_IShellItemImageFactory, sif);
- bmp := TBitmap.Create();
- bmp.SetSize(16,16);
- bmp.PixelFormat := pf32bit;
- bmp.AlphaFormat := afPremultiplied;
- sif.GetImage(iconSize, SIIGBF_RESIZETOFIT, hbmp);
- bmp.Handle := hbmp;
- mi := TMenuItem.Create(cpMenu);
- mi.Bitmap := bmp;
- mi.Caption := cpDisplay.pOleStr;
- //add item to cpMenu : TPopupMenu
- cpMenu.Items.Add(mi);
- end;
- end;
Enumerating Control panel items using Shell API