SHAddToRecentDocs без файла? - PullRequest
       22

SHAddToRecentDocs без файла?

1 голос
/ 25 марта 2010

Я играл с IRC-клиентом, интегрировал его с панелью приложений Windows 7.

Чтобы получить список «Частых» или «Недавних» элементов, необходимо вызвать API SHAddToRecentDocs. Я хочу добавить последние посещенные IRC-каналы в Windows 7 Jumplist для приложения IRC. Теперь моя проблема в том, что IRC-каналы не существуют в файловой системе. И SHAddToRecentDocs, похоже, настаивает на получении какого-либо объекта файловой системы.

Я попытался обойти это, создав IShellItem, указывающий на мое приложение, и дал ему командную строку для запуска канала. Однако оболочка восстает и до сих пор не добавила ни одной из моих «недавних попыток документа» в список переходов.

Нет ли способа сделать это без создания какого-либо совершенно нежелательного объекта файловой системы?

1 Ответ

3 голосов
/ 31 марта 2010

Код в ответе на вопрос 1671793 проходит часть пути. Вы хотите IShellLink вместо IShellItem. Я попробовал этот код по крупицам. Вещи не будут работать, прежде чем использовать IPropertyStore для установки заголовка. Код IPersistFile не требуется.

Все это говорит, что, хотя у меня теперь есть элементы, появляющиеся при щелчке правой кнопкой мыши на значке панели задач моего приложения, у меня еще нет их отображения в качестве подменю моего приложения в меню "Пуск" (как это происходит с документами Word). например), так что я еще не совсем доволен. Я думаю, что это результат предупреждения в документах для SHAddToRecentDocs:

Исполняемые файлы (.exe) отфильтровываются из списка недавно использованных документов в Windows XP и более поздних версиях. Хотя SHAddToRecentDocs примет путь к исполняемому файлу, этот файл не появится в списке последних элементов.

Вот мой код в его нынешнем виде. Я прыгаю через некоторые обручи, поскольку моя среда разработки использует более старый Windows SDK (поэтому я должен создать PKEY_Title для себя), и мое приложение должно поддерживать Win2k (поэтому я не хочу привязываться к функциям, таким как InitPropVariantFromString, которые требуется более новая версия Windows).

HRESULT hr;
IShellLink* link;

// Get a pointer to the IShellLink interface.
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&link);
if (FAILED(hr))
    return;
link->SetPath(path_to_app);
link->SetArguments(L"/some /args");
link->SetDescription(L"A description");  // Turns into tooltip

IPropertyStore* prop_store;
hr = link->QueryInterface(&prop_store);
if(SUCCEEDED(hr))
{
    PROPVARIANT pv;
    pv.vt=VT_LPWSTR;
    pv.pwszVal=L"Name of item"; // Turns into actual item name

    PROPERTYKEY PKEY_Title;
    CLSIDFromString(L"{F29F85E0-4FF9-1068-AB91-08002B27B3D9}", &(PKEY_Title.fmtid));
    PKEY_Title.pid=2;

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

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

SHARDAPPIDINFOLINK appinfo;
appinfo.pszAppID=L"Company.AppName"; // Previously registered using SetCurrentProcessExplicitAppUserModelID
appinfo.psl=link;
SHAddToRecentDocs(SHARD_APPIDINFOLINK, &appinfo);
link->Release();
...