2012-10-11 17 views
11

To może być łatwe pytanie, ale nie jestem nawet pewien terminologii wyszukiwania, więc muszę zapytać. Chcę, aby mój program miał menu po obróceniu go, jeśli jest przypięte do menu startowego. Załączam zrzut ekranu, w którym funkcja powershell okna ilustruje tę funkcję i wyświetla listę zadań.Jak utworzyć menu w menu Start dla mojego programu?

enter image description here

Inne programy czasami używają tego do listy ostatnio otwieranych plików, itd. Jestem pewien, że to wystarczy, że norma nie jest podręcznikiem na nim gdzieś, czy ktoś mi umysł, wskazując na to, czy tłumacząc jak Zrób to? Mam nadzieję, że nie ma większego znaczenia, jaki język jest używany, ale jestem biegły w Delphi, C++ i C#.

Odpowiedz

12

Musisz użyć metody ICustomDestinationList.AddUserTasks, która jest częścią Taskbar Extensions wprowadzonym w Windows 7.

UPDATE

Spróbuj przykładową aplikację konsoli uruchomić kod i przenieść skrót aplikacji na początek menu. (To tylko fragment próbki, więc pamiętaj dodać kontrole na wynik wszystkich metod, które zwracają wartość HResult)

program ProjectTasks; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, 
    ActiveX, 
    windows, 
    ComObj, 
    ShlObj, 
    PropSys, 
    ObjectArray; 

const 
    PKEY_TITLE : TPropertyKey = (fmtID : '{F29F85E0-4FF9-1068-AB91-08002B27B3D9}'; pID : 2); 

procedure CreateTaskList; 
var 
    LCustomDestinationList : ICustomDestinationList; 
    pcMaxSlots : Cardinal; 
    ppv : IObjectArray; 
    poa : IObjectCollection; 
    LTask : IShellLink; 
    LPropertyStore : IPropertyStore; 
    LTitle : TPropVariant; 
    LTaskBarList : ITaskBarList; 
    LTaskBarList3 : ITaskBarList3; 
    hr : HRESULT; 
begin 
    LTaskBarList := CreateComObject(CLSID_TaskBarList) as ITaskBarList; 
    hr := LTaskBarList.QueryInterface(IID_ITaskBarList3, LTaskBarList3); 
    if hr <> S_OK then exit; 


    LCustomDestinationList := CreateComObject(CLSID_DestinationList) as ICustomDestinationList; 
    LCustomDestinationList.BeginList(pcMaxSlots, IID_IObjectArray, ppv); 
    poa := CreateComObject(CLSID_EnumerableObjectCollection) as IObjectCollection; 


    LTask := CreateComObject(CLSID_ShellLink) as IShellLink; 
    LTask.SetPath(pChar(ParamStr(0))); //set the path to the exe 
    LTask.SetDescription('This is a description sample'); 
    LTask.SetArguments(PChar('Bar')); 
    LTask.SetIconLocation(PChar('Shell32.dll'),1); 
    LPropertyStore := LTask as IPropertyStore; 
    LTitle.vt := VT_LPWSTR; 
    LTitle.pwszVal := PChar('This is the Task 1'); 
    LPropertyStore.SetValue(PKEY_Title,LTitle); 
    LPropertyStore.Commit; 
    poa.AddObject(LTask); 

    LTask := CreateComObject(CLSID_ShellLink) as IShellLink; 
    LTask.SetPath(PChar(ParamStr(0))); //set the path to the exe 
    LTask.SetDescription('This is a description sample'); 
    LTask.SetArguments(PChar('Foo')); 
    LTask.SetIconLocation(pChar('Shell32.dll'),1); 
    LPropertyStore := LTask as IPropertyStore; 
    LTitle.vt := VT_LPWSTR; 
    LTitle.pwszVal := pChar('This is the Task 2'); 
    LPropertyStore.SetValue(PKEY_Title,LTitle); 
    LPropertyStore.Commit; 
    poa.AddObject(LTask); 


    LCustomDestinationList.AddUserTasks(poa as IObjectArray); 
    LCustomDestinationList.CommitList; 
end; 

begin 
try 
    CoInitialize(nil); 
    try 
     CreateTaskList; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 

enter image description here

+0

Jest to dobry przykład tego, jak to zrobić w C# [tutaj ] (http://www.canofcode.co.uk/software/how-to-add-jumplists-to-ac-application/). – nateirvin

Powiązane problemy