1

急ごしらえの質問:Windows 7の新しいタスクバーAPIのいくつかをいじっていて、アプリのジャンプリストに最近のアイテムが表示されるようになりましたが、ファイル名とは異なるタイトルで表示したいと思います(アプリのほとんどのファイルはオープニングは非常によく似た名前になります)。ただし、IShellItemインターフェイスを使用してこれを行う方法はわかりません。これを実現するには、カスタムカテゴリとIShellLinksを使用する必要がありますか?

参考までに、私の現在のコードは次のようになります。

void AddRecentApp(const wchar_t* path, const wchar_t* title /* Can I even use this? */ ) {
    HRESULT hres;

    hres = CoInitialize(NULL);

    IShellItem* recentItem;
    hres = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&recentItem));
    if(SUCCEEDED(hres)) {
        SHARDAPPIDINFO recentItemInfo;
        recentItemInfo.pszAppID = MY_APP_USER_MODEL_ID;
        recentItemInfo.psi = recentItem;

        SHAddToRecentDocs(SHARD_APPIDINFO, &recentItemInfo);

        recentItem->Release();
    }
}
4

1 に答える 1

2

理解した。IShellItemsはファイルの単なる表現であるため、そのファイルの情報のみを提供します(カスタムタイトルなどはありません)。IShellLinkは基本的にショートカットであり、表示と起動時のアクションの点ではるかに柔軟性があります。この状況では適切です。これが私の新しいコードです:

void AddRecentApp(const wchar_t* path, const wchar_t* title) {
    HRESULT hres;
    hres = CoInitialize(NULL);

    // Shell links give us more control over how the item is displayed and run
    IShellLink* shell_link;
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shell_link));
    if(SUCCEEDED(hres)) {
        // Set up the basic link properties
        shell_link->SetPath(path);
        shell_link->SetArguments(L"--some-command-line-here"); // command line to execute when item is opened here!
        shell_link->SetDescription(title); // This is what shows in the tooltip
        shell_link->SetIconLocation(L"/path/to/desired/icon", 0); // can be an icon file or binary

        // Open up the links property store and change the title
        IPropertyStore* prop_store;
        hres = shell_link->QueryInterface(IID_PPV_ARGS(&prop_store));
        if(SUCCEEDED(hres)) {
            PROPVARIANT pv;
            InitPropVariantFromString(title, &pv);

            // Set the title property.
            prop_store->SetValue(PKEY_Title, pv); // THIS is where the displayed title is actually set
            PropVariantClear(&pv);

            // Save the changes we made to the property store
            prop_store->Commit();
            prop_store->Release();
        }

        // The link must persist in the file system somewhere, save it here.
        IPersistFile* persist_file; 
        hres = shell_link->QueryInterface(IID_PPV_ARGS(&persist_file));
        if(SUCCEEDED(hres)) {
            hres = persist_file->Save(L"/link/save/directory", TRUE); 
            persist_file->Release(); 
        }

        // Add the link to the recent documents list
        SHARDAPPIDINFOLINK app_id_info_link;
        app_id_info_link.pszAppID = MY_APP_USER_MODEL_ID;
        app_id_info_link.psl = shell_link;
        SHAddToRecentDocs(SHARD_APPIDINFOLINK, &app_id_info_link);

        shell_link->Release();
    }
}  
于 2009-11-04T16:04:12.593 に答える