我想創建一個殼樹控件。我不希望所有從IShellFilder::EnumObjects
調用返回的項目都顯示在樹上,因爲我需要過濾諸如回收站和控制面板等項目。如何篩選的IShellFolder :: EnumObjects導致
我的代碼如下所示:
IShellFolder* pDesktopFolder=NULL;
SHGetDesktopFolder(&pDesktopFolder);
LPITEMIDLIST pidlParent=NULL;
IShellFolder* pParentFolder = NULL;
pDesktopFolder->BindToObject(pidlParent,NULL, IID_IShellFolder, (LPVOID*)&pParentFolder);
IEnumIDList* pEnumIDList = NULL;
SHCONTF SHFlag=NULL;
SHFlag=SHCONTF_FOLDERS | SHCONTF_INIT_ON_FIRST_NEXT | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN;
HRESULT hr= pParentFolder->EnumObjects(NULL, SHFlag, &pEnumIDList);
if (NOERROR == hr)
{
LPITEMIDLIST pidl = NULL, pidlAbs;
CString csFileType;
HTREEITEM hItem=NULL;
while (NOERROR == pEnumIDList->Next(1, &pidl, NULL))
{
//Filter out control panel, recycle bin items and other non usable items
}
}
我不想讓每個項目的顯示名稱,並做一個字符串比較,因爲名字可以根據操作系統語言更改。
可以過濾根據每個項目的CLSID做了什麼?最好的辦法是什麼?
你不應該使用的系統文件夾的GUID這樣。使用'SHGetFolderLocation()'和/或'SHGetKnownFolderIDList()'函數來獲取'ITEMIDLIST's系統文件夾,包括回收站('CSIDL_BITBUCKET' /'FOLDERID_RecycleBinFolder')和控制面板('CSIDL_CONTROLS' /'FOLDERID_ControlPanelFolder' )。 –
可以發佈有關如何在我的代碼上下文中使用這些代碼的答案 –
還要記住,SHGetKnownFolderIDList不適用於XP。 –