ジャンプリストを使ってみる その1

Windows7のタスクバーの新機能ジャンプリストを使ってみようと調べて見ました。
第15回デベロッパーキャンプ B6セッションとかこことか参照したのをまとめておく。

まずは、前準備として必要なAPIとか関数定義をWindows SDKのpropvarutil.hから移植
APIの方は、Propsys.dllてDLLを参照するんですが、このDLLはMSDNによるとXPとかだと無い可能性も高いので遅延ロード指定しておきます。ちゃんとやるなら、LoadLibraryを使う方が良いかもです。

uses
  ActiveX, Windows, ShLwApi;

// 遅延ロード指定してるのでプラットフォーム依存の警告がでるのを抑止
{$WARN SYMBOL_PLATFORM OFF}
function PropVariantClear(var pvar: TPropVariant): HRESULT; stdcall; external 'Ole32.dll';
function PropVariantToStringWithDefault(var propvarIn: TPropVariant; pszDefault: LPCWSTR): PWideChar; stdcall; external 'Propsys.dll' delayed;
{$WARN SYMBOL_PLATFORM ON}

function InitPropVariantFromBoolean(fVal: Boolean;
  var ppropvar: TPropVariant): HRESULT;
function InitPropVariantFromString(sz: string;
  var ppropvar: TPropVariant): HRESULT;

implementation

procedure PropVariantInit(var pvar: TPropVariant);
begin
  ZeroMemory(@pvar, SizeOf(TPropVariant));
end;

function InitPropVariantFromBoolean(fVal: Boolean;
  var ppropvar: TPropVariant): HRESULT;
begin
  ppropvar.vt := VT_BOOL;
  if fVal then
    ppropvar.boolVal := True
  else
    ppropvar.boolVal := False;
  Result := S_OK;
end;

function InitPropVariantFromString(sz: string;
  var ppropvar: TPropVariant): HRESULT;
var
  hr: HRESULT;
begin
  ppropvar.vt := VT_LPWSTR;
  hr := SHStrDupW(PChar(sz), ppropvar.pwszVal);
  if FAILED(hr) then
  begin
    PropVariantInit(ppropvar);
  end;
  Result := hr;
end;

ジャンプリストを追加するには、ICustomDestinationListを使用するんですが、その前にAppIDて言うのが必要になってきます。これは、ウィンドウをグループ化したりとかジャンプリストで使用したりするもののようです。
特に指定しない場合は、自動で割り当てられるみたいですが自分で割り当てをしておいた方が良いようです。
このAppIDの設定は、ICustomDestinationListを取得したりする前に実行する必要があります。
ICustomDestinationListを取得した後は、まずBeginListメソッドを呼びます。次に、AppendCategoryAddUserTasksAppendKnownCategoryを使ってジャンプリストに追加した後、CommitList又は、AbortListを呼び出して一連の処理終了です。実際の処理はまた後日。