2012-10-11 12 views
11

Bu kolay bir soru olabilir ama aranacak terminolojiden bile emin değilim, bu yüzden sormak zorundayım. Programımın, başlat menüsüne sabitlendiğinde üzerine getirildiğinde bir menüye sahip olmasını istiyorum. Windows powershell'in bu işlevi gösterdiği bir ekran görüntüsü ekliyorum ve bir görev listesi sunuyor.Programım için başlangıç ​​menüsünde nasıl bir menü oluşturabilirim?

enter image description here

Diğer programlar bazen, bu üzerinde bir öğretici bir yerde olduğunu yeterince standarttır eminim son açılan dosyaları listelemek vb kullanmak birisi zihnin nasıl kendisine beni işaret veya açıklayan ediyorum Bunu yap? Umarım dilin ne kadar kullanıldığı önemli değildir, ama ben Delphi, C++ ve C# 'da yetkinim.

cevap

12

Windows tanıtılan Taskbar Extensions parçasıdır ICustomDestinationList.AddUserTasks yöntemi kullanmalıdır 7.

GÜNCELLEME

, bu örnek konsol uygulaması deneyin kod çalıştırmasına ve başlangıç ​​uygulamanın bir kısayol taşımak Menü.

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

burada [C# bunu nasıl iyi bir örnek var (bu, sadece bir örnek parçacık yüzden HResult değeri döndürür tüm yöntemlerin sonucu için kontroller eklemek unutmayın) ] (http://www.canofcode.co.uk/software/how-to-add-jumplists-to-ac-application/). – nateirvin