3

シェル ツリー コントロールを作成しようとしています。IShellFilder::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
     }
}

OS 言語によって名前が変わる可能性があるため、各項目の表示名を取得して文字列比較を行いたくありません。

各アイテムの CLSID に基づいてフィルタリングを行うことはできますか? そして、それを行う最良の方法は何ですか?

4

3 に答える 3

4

IShellFolder と子 pidl がある場合SHGetDataFromIDList(...,SHGDFIL_DESCRIPTIONID)、pidl ターゲットの CLSID を取得するために使用できます。

以下も参照してください。

于 2012-06-10T10:27:10.017 に答える
0

実際のファイルシステム項目のみが必要な場合 (BrowseForFolder のように)、 を使用GetAttributesOf(..)して確認できSFGAO_FILESYSANCESTORます。属性がない場合は、ファイルシステム項目ではありません.. (zip ファイル、コントロールパネル、 recyclebin には属性がありません)

于 2013-10-22T16:30:14.203 に答える
-1

解決済み:

私はこれを行い、その作業を行いましたが、他のフォルダーの GUID のリストをどこで取得できるかを確認する必要があります。

ULONG nEaten=0;
    LPITEMIDLIST PidlCPanel;
    ULONG nCPAttrib = 0;
    HRESULT hr = pFolder->ParseDisplayName(NULL, NULL, _T("::{26EE0668-A00A-44D7-9371-BEB064C98683}"), &nEaten, &PidlCPanel, &nCPAttrib);
    BOOL bRes = ILIsEqual(pidl, PidlCPanel);
于 2012-06-10T09:06:34.280 に答える