8

優れた Inno Setup インストーラーを使用していますが、一部のアプリケーション (多くの場合 Microsoft から) が、スタート メニュー (Windows 7 の場合) で既に非常に目立つ (「ピン留め」) された起動アイコンでインストールされることに気付きました。スタートメニューでアイコンを「大きく」するために、最近使用したアルゴリズムに完全に依存していますか、それともインストーラーからアプリケーションを昇格させる方法はありますか?

4

3 に答える 3

8

プログラムをピン留めすることは可能ですが、公式にはできません。に投稿されたコードに基づいてthis thread(@Mark Redman によってリンクされた記事で説明されているのと同じ方法を使用します)、次のように書きました。

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif

const
  // these constants are not defined in Windows
  SHELL32_STRING_ID_PIN_TO_TASKBAR = 5386;
  SHELL32_STRING_ID_PIN_TO_STARTMENU = 5381;
  SHELL32_STRING_ID_UNPIN_FROM_TASKBAR = 5387;
  SHELL32_STRING_ID_UNPIN_FROM_STARTMENU = 5382;

type
  HINSTANCE = THandle;
  HMODULE = HINSTANCE;

  TPinDest = (
    pdTaskbar,
    pdStartMenu
  );

function LoadLibrary(lpFileName: string): HMODULE;
  external 'LoadLibrary{#AW}@kernel32.dll stdcall';
function FreeLibrary(hModule: HMODULE): BOOL;
  external 'FreeLibrary@kernel32.dll stdcall';
function LoadString(hInstance: HINSTANCE; uID: UINT;
  lpBuffer: string; nBufferMax: Integer): Integer;
  external 'LoadString{#AW}@user32.dll stdcall';

function TryGetVerbName(ID: UINT; out VerbName: string): Boolean;
var
  Buffer: string;
  BufLen: Integer;
  Handle: HMODULE;
begin
  Result := False;

  Handle := LoadLibrary(ExpandConstant('{sys}\Shell32.dll'));
  if Handle <> 0 then
  try
    SetLength(Buffer, 255);
    BufLen := LoadString(Handle, ID, Buffer, Length(Buffer));

    if BufLen <> 0 then
    begin
      Result := True;
      VerbName := Copy(Buffer, 1, BufLen);
    end;
  finally
    FreeLibrary(Handle);
  end;
end;

function ExecVerb(const FileName, VerbName: string): Boolean;
var
  I: Integer;
  Shell: Variant;
  Folder: Variant;
  FolderItem: Variant;
begin
  Result := False;

  Shell := CreateOleObject('Shell.Application');
  Folder := Shell.NameSpace(ExtractFilePath(FileName));
  FolderItem := Folder.ParseName(ExtractFileName(FileName));

  for I := 1 to FolderItem.Verbs.Count do
  begin
    if FolderItem.Verbs.Item(I).Name = VerbName then
    begin
      FolderItem.Verbs.Item(I).DoIt;
      Result := True;
      Exit;
    end;
  end;  
end;

function PinAppTo(const FileName: string; PinDest: TPinDest): Boolean;
var
  ResStrID: UINT;
  VerbName: string;
begin
  case PinDest of
    pdTaskbar: ResStrID := SHELL32_STRING_ID_PIN_TO_TASKBAR;
    pdStartMenu: ResStrID := SHELL32_STRING_ID_PIN_TO_STARTMENU;
  end;
  Result := TryGetVerbName(ResStrID, VerbName) and ExecVerb(FileName, VerbName);
end;

function UnpinAppFrom(const FileName: string; PinDest: TPinDest): Boolean;
var
  ResStrID: UINT;
  VerbName: string;
begin
  case PinDest of
    pdTaskbar: ResStrID := SHELL32_STRING_ID_UNPIN_FROM_TASKBAR;
    pdStartMenu: ResStrID := SHELL32_STRING_ID_UNPIN_FROM_STARTMENU;
  end;
  Result := TryGetVerbName(ResStrID, VerbName) and ExecVerb(FileName, VerbName);
end;

上記のコードは、最初にShell32.dllライブラリの文字列テーブルからアプリケーションを固定または固定解除するためのメニュー項目のキャプションを読み取ります。次に、Windows シェルに接続し、ターゲット アプリに接続します。path はオブジェクトを作成し、Folderオブジェクトを取得して、FolderItemこのオブジェクトで利用可能なすべての動詞を繰り返し、それらの名前がShell32.dllライブラリ文字列テーブルから読み取ったものと一致するかどうかを確認します。その場合、メソッドを呼び出して動詞項目アクションを呼び出しDoIt、反復を終了します。

ピン留めのための上記のコードの可能な使用法は次のとおりです。

if PinAppTo(ExpandConstant('{sys}\calc.exe'), pdTaskbar) then
  MsgBox('Calc has been pinned to the taskbar.', mbInformation, MB_OK);
if PinAppTo(ExpandConstant('{sys}\calc.exe'), pdStartMenu) then
  MsgBox('Calc has been pinned to the start menu.', mbInformation, MB_OK);

固定解除の場合:

if UnpinAppFrom(ExpandConstant('{sys}\calc.exe'), pdTaskbar) then
  MsgBox('Calc is not pinned to the taskbar anymore.', mbInformation, MB_OK);
if UnpinAppFrom(ExpandConstant('{sys}\calc.exe'), pdStartMenu) then
  MsgBox('Calc is not pinned to the start menu anymore.', mbInformation, MB_OK);

このコードは Windows 7 で動作します (そして、私がテストした Windows 8.1 でもタスクバーのピン留めが行われます) が、プログラムでプログラムをタスクバーやスタート メニューにピン留めする公式の方法がないため、これは本当にハックな方法であることに注意してください。それは、ユーザーが自分の選択で行うべきことです。

于 2014-07-31T18:08:24.880 に答える
6

タスクバー/スタート メニューにピン留めするプログラム的な方法がないのには理由があります。私の経験では、スタート メニューが新しく作成されたショートカットを強調表示するのを見たことがありますが、これはまさにこの状況を処理するように設計されています。新しくインストールされたプログラムがスタート メニューに表示されるのは、おそらくそのアルゴリズムによるものであり、インストーラーがプログラムをそこに配置したためではありません。

つまり、新しいショートカットが強調表示されていない場合は、API 関数を使用してスタート メニューにショートカットを作成するのではなく、インストーラーが既存のショートカットを抽出し、古いタイムスタンプを保持している可能性があります。

于 2009-10-27T08:27:39.403 に答える
4

見てください: http://blogs.technet.com/deploymentguys/archive/2009/04/08/pin-items-to-the-start-menu-or-windows-7-taskbar-via-script.aspx

于 2009-10-27T08:27:21.603 に答える