2

私は IRC クライアントをいじっていて、それを Windows 7 アプリ バーと統合していました。

「頻繁」または「最近」の項目リストを取得するには、SHAddToRecentDocs API を呼び出す必要があります。最近アクセスした IRC チャネルを、IRC アプリケーションの Windows 7 ジャンプリストに追加したいと考えています。さて、私の問題は、ファイル システムに IRC チャネルが存在しないことです。また、SHAddToRecentDocs は、ある種のファイル システム オブジェクトを取得することを主張しているようです。

アプリケーションを指す IShellItem を作成し、チャネルを起動するコマンド ラインを与えることで、この問題を回避しようとしました。ただし、シェルは反抗的であり、これまでのところ、私の「最近のドキュメント」の試みが目に見える形でジャンプリストに追加されていません。

まったく不要なファイルシステム オブジェクトを作成せずにこれを行う方法はありませんか?

4

1 に答える 1

3

質問1671793への回答のコードは途中で終わります。IShellLinkの代わりに必要ですIShellItem。私はそのコードを少しずつ試しました。IPropertyStoreタイトルを設定するためにを使用する前に、物事は機能しませんでした。コードはIPersistFile必要ないようです。

とはいえ、アプリのタスクバーアイコンを右クリックするとアイテムが表示されるようになりましたが、スタートメニューにアプリのサブメニューとして表示されることはまだありません(たとえば、ワードドキュメントのように) )、それで私はまだ完全に満足していません。これは、次のドキュメントの警告の結果だと思いますSHAddToRecentDocs

実行可能(.exe)ファイルは、WindowsXP以降のバージョンで最近使用されたドキュメントリストからフィルタリングされます。SHAddToRecentDocsは実行可能ファイルのパスを受け入れますが、そのファイルは[最近のアイテム]リストに表示されません。

これが現状の私のコードです。開発環境で古いWindowsSDKを使用していて(したがって、自分で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();
于 2010-03-30T23:06:53.953 に答える