2009-11-04 2 views
1

Вопрос Quickie: Я просматриваю некоторые из новых API-интерфейсов панели задач в Windows 7 и обнаружил, что последние элементы в моем приложении jumplist отображались, но я хотел бы отображать их под другое название, отличное от имени файла (большинство файлов, которые откроет мое приложение, будут иметь очень похожие имена). Однако я не вижу никакого способа сделать это с интерфейсом IShellItem. Должен ли я использовать пользовательские категории и IShellLinks для этого?Пользовательские заголовки для Windows 7 Список переходов Последние статьи

Для справки, мой текущий код выглядит следующим образом:

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(); 
    } 
} 

ответ

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(); 
    } 
}