2010-03-25 2 views
1

저는 IRC 클라이언트를 가지고 놀고 있었고, Windows 7 앱 바에 그것을 통합 시켰습니다.파일이없는 SHAddToRecentDocs?

"자주"또는 "최근"항목 목록을 얻으려면 SHAddToRecentDocs API를 호출해야합니다. IRC 응용 프로그램 용 Windows 7 Jumplist에 방문한 최근 IRC 채널을 추가하고 싶습니다. 내 문제는 IRC 채널이 파일 시스템에 존재하지 않는다는 것입니다. 그리고 SHAddToRecentDocs는 일종의 파일 시스템 객체를 가져야한다고 주장하는 것 같습니다.

Ive는 내 응용 프로그램을 가리키는 IShellItem을 만들고 채널을 시작하기위한 명령 줄을 제공하여이 문제를 해결하려고했습니다. 그러나 쉘은 반란을 일으키고 있으며, 지금까지 Jumplist에 대한 나의 "최근 문서"시도를 눈에 띄게 추가하지 않았습니다.

완전히 원하지 않는 파일 시스템 개체를 만들지 않으면 이렇게 할 방법이 없습니까?

+0

아이러니하게도 코드의 나머지 부분이 제대로 작동하면 IShellLink가 지속되는 부분을 지적하고 잘 보입니다. "최근"항목은 유지되는 IShellLink에 의존하지 않는 것 같습니다. –

+0

나는 방금 내 자신의 글을 게시하는 대신 누군가의 elses 덧글을 편집 했습니까? 그렇다면 어리 석다. 그것을 실행 취소하는 방법을 볼 수 없습니다. –

+0

답변을 추가 했으므로 어느 시점에서 내 의견을 삭제했습니다. 귀하의 의견 게시와 동시에 내 삭제를 확인한 것 같습니다. –

답변

3

대답의 코드는 question 1671793입니다. IShellItem 대신 IShellLink이 필요합니다. 나는 그 코드를 조금씩 시도했다. IPropertyStore을 사용하여 제목을 설정하기 전에는 문제가 해결되지 않습니다. IPersistFile 코드가 필요하지는 않습니다.

내 앱의 작업 표시 줄 아이콘을 마우스 오른쪽 버튼으로 클릭 할 때 나타나는 항목이 있지만 시작 메뉴에 내 앱의 하위 메뉴로 나타나지는 않습니다 (워드 프로세서 그렇습니다.) 그래서 나는 완전히 만족하지 못했습니다. 나는이 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();