2012-10-11 2 views
11

これは簡単な質問かもしれませんが、私は検索する用語についてもわからないので、私は尋ねなければなりません。私はスタートメニューに固定されている場合、私のプログラムは、それが上にホバリングされたときにメニューを持っています。私は、Windows PowerShellがこの機能を説明し、タスクのリストを提示するスクリーンショットを添付しています。プログラムのスタートメニューにメニューを作成するにはどうすればよいですか?

enter image description here

他のプログラム時々など、最近開いたファイルを一覧表示するためにこれを使用し、私は誰かがそれに私を指しているか、どのように説明する気になり、これはそれのチュートリアルがどこかにあることを十分に標準であると確信していますこれを行う?あまりにも多くの言語が使用されていても問題はないと思いますが、私はDelphi、C++、およびC#に堪能です。

答えて

12

あなたは、このサンプル・コンソールアプリを試してみて、コードを実行し、スタートにアプリのショートカットを移動UPDATE

のWindows 7で

を導入Taskbar Extensionsの一部であるICustomDestinationList.AddUserTasks方法を、使用する必要があります。メニュー。

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

は、ここで[C#でこれを行う方法の良い例があります(これは、単にサンプルスニペットであるので、HResult値を返すすべてのメソッドの結果のためのチェックを追加覚えています) ](http://www.canofcode.co.uk/software/how-to-add-jumplists-to-ac-application/)。 – nateirvin

関連する問題