Вопрос Как закрепить ярлык на панели задач

Xabib2302

Новичок
Доброе время суток. Есть одна проблема. Хочу использовать утилиту syspin для закрепления ярлыков в пуск и панель задач, но утилита не запускается во время де/инсталляции. Либо запускается но, нет ярлыков. Бывает, что через раз закрепляет ярлык в пуске. Хотя вручную через cmd все работает. Проверял на Win 10 1909.
 
Последнее редактирование:

vint56

Ветеран
Проверенный
Pin To Taskbar Utility v0.99.9.1
Technosys Corporation, Copyright(c) 1998-2019, www.technosys.net
Freeware
Coded by Berk Ceyhun OZGEN

Usage :
Usage :
syspin ["file"] #### or syspin ["file"] "commandstring"
5386 : Pin to taskbar
5387 : Unpin from taskbar
51201 : Pin to start

51394 : Unpin to start
Samples :
syspin "%PROGRAMFILES%\Internet Explorer\iexplore.exe" 5386
syspin "C:\Windows\notepad.exe" "Pin to taskbar"
syspin "%WINDIR%\System32\calc.exe" "Pin to start"
syspin "%WINDIR%\System32\calc.exe" "Unpin from taskbar"
syspin "C:\Windows\System32\calc.exe" 51201

Note : You cannot pin any metro app or batch file

Для продолжения нажмите любую клавишу . . .

Result := GetFromRes('_IS_SYSPIN', 'syspin.exe') а где код для удаления


procedure CurPageChanged(CurPageID: Integer);
var
ResultCode: integer;
begin
case CurPageID of
wpFinished:
begin
Exec(ExpandConstant('{app}\TaskBar\syspin.exe'), ExpandConstant('"{#ExePath}" c:5386'),'', SW_Hide, ewWaitUntilTerminated, ResultCode);
//Exec(ExpandConstant('{app}\TaskBar\PinUtil.exe'), ExpandConstant('Taskbar "{#ExePath}"'),'', SW_Hide, ewWaitUntilTerminated, ResultCode);
end;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultCode: integer;
begin
case CurUninstallStep of
usUninstall: begin
Exec(ExpandConstant('{app}\TaskBar\syspin.exe'), ExpandConstant('"{#ExePath}" c:5387'),'', SW_Hide, ewWaitUntilTerminated, ResultCode);
end;
end;
end;
 

Xabib2302

Новичок
Переделал скрипт под запуск syspin через код и все равно. Хотя после установки видно, что перезагружается проводник, но ярлыков нет.
 

vint56

Ветеран
Проверенный
У меня Windows 10 pro версия 2004 syspin через раз добавляет
Попробуй использовать PinUtil.exe он хорошо Taskbar а StartMenu не хочет добавлять
 

Вложения

Хамик

Старожил
от El Sanchez:
Код:
const
  CLSID_TaskbandPin = '{90AA3A4E-1CBA-4233-B8BB-535773D48449}';
  IID_IPinnedList2 = '{BBD20037-BC0E-42F1-913F-E2936BB0EA0C}';
  IID_IPinnedList3 = '{0DD79AE2-D156-45D4-9EEB-3B549769E940}';
  CLSCTX_INPROC_SERVER = 1;
  PLMC_EXPLORER = 4;
  S_OK = 0;

type
  PItemIDList = LongWord;

  IPinnedList2 = interface(IUnknown)
    '{BBD20037-BC0E-42F1-913F-E2936BB0EA0C}'
    procedure EnumObjects; // dummy
    function Modify(unpin, pin: PItemIDList): HRESULT;
    procedure GetChangeCount; // dummy
    procedure GetPinnableInfo; // dummy
    procedure IsPinnable; // dummy
    procedure Resolve; // dummy
    function IsPinned(pidl: PItemIDList): HRESULT;
    procedure GetPinnedItem; // dummy
    procedure GetPinnedItemForAppID; // dummy
    procedure ItemChangeNotify; // dummy
    procedure UpdateForRemovedItemsAsNecessary; // dummy
  end;

  IPinnedList3 = interface(IUnknown)
    '{0DD79AE2-D156-45D4-9EEB-3B549769E940}'
    procedure EnumObjects; // dummy
    procedure GetPinnableInfo; // dummy
    procedure IsPinnable; // dummy
    procedure Resolve; // dummy
    procedure LegacyModify; // dummy
    procedure GetChangeCount; // dummy
    function IsPinned(pidl: PItemIDList): HRESULT;
    procedure GetPinnedItem; // dummy
    procedure GetAppIDForPinnedItem; // dummy
    procedure ItemChangeNotify; // dummy
    procedure UpdateForRemovedItemsAsNecessary; // dummy
    procedure PinShellLink; // dummy
    procedure GetPinnedItemForAppID; // dummy
    function Modify(unpin, pin: PItemIDList; ModifyCaller: LongWord): HRESULT;
  end;

function CoCreateInstance(rclsid: TCLSID; pUnkOuter: LongWord;
  dwClsContext: DWORD; riid: TIID; out ppv: IUnknown): HRESULT; external 'CoCreateInstance@ole32.dll stdcall';
function ILCreateFromPath(const pszPath: string): PItemIDList; external 'ILCreateFromPathW@shell32.dll stdcall';
procedure ILFree(pidl: PItemIDList); external 'ILFree@shell32.dll stdcall';

function PinToTaskbar(const AFilename: string; AIsPin: Boolean): Boolean;
// AFilename : full path to executable file
// AIsPin....: False - unpin from TaskBar, True - pin to TaskBar
var
  LPIDL: PItemIDList;
  LUnk: IUnknown;
  LPinnedList2: IPinnedList2;
  LPinnedList3: IPinnedList3;
  LShellApp: Variant;
  LVerb: string;
begin
  Result := False;
  if FileExists(AFilename) and
    (GetWindowsVersion > $06010000) then
  try
    LPIDL := ILCreateFromPath(AFilename);
    try
      { Windows 10 (build 1809) and above. }
      OleCheck(CoCreateInstance(StringToGUID(CLSID_TaskbandPin), 0,
        CLSCTX_INPROC_SERVER, StringToGUID(IID_IPinnedList3), LUnk));
      LPinnedList3 := LUnk as IPinnedList3;
    except
      try
        { Windows 7, 8, 8.1 if IPinnedList2 supported. }
        OleCheck(CoCreateInstance(StringToGUID(CLSID_TaskbandPin), 0,
          CLSCTX_INPROC_SERVER, StringToGUID(IID_IPinnedList2), LUnk));
        LPinnedList2 := LUnk as IPinnedList2;
      except
        { Below Windows 10 (build 1809) fallback. }
        LShellApp := CreateOleObject('Shell.Application');
      end;
    end;
    if AIsPin then  // pin
    begin
      if LPinnedList3 <> nil then
      begin
        Result := LPinnedList3.IsPinned(LPIDL) <> S_OK;
        if Result then
          OleCheck(LPinnedList3.Modify(0, LPIDL, PLMC_EXPLORER));
      end
      else if LPinnedList2 <> nil then
      begin
        Result := LPinnedList2.IsPinned(LPIDL) <> S_OK;
        if Result then
          OleCheck(LPinnedList2.Modify(0, LPIDL));
      end else
        LVerb := 'taskbarpin';
    end else        // unpin
    begin
      if LPinnedList3 <> nil then
      begin
        Result := LPinnedList3.IsPinned(LPIDL) = S_OK;
        if Result then
          OleCheck(LPinnedList3.Modify(LPIDL, 0, PLMC_EXPLORER));
      end
      else if LPinnedList2 <> nil then
      begin
        Result := LPinnedList2.IsPinned(LPIDL) = S_OK;
        if Result then
          OleCheck(LPinnedList2.Modify(LPIDL, 0));
      end else
        LVerb := 'taskbarunpin';
    end;
    if LVerb <> '' then
      LShellApp.Windows.Item.Document.Application
        .NameSpace(ExtractFileDir(AFilename))
        .ParseName(ExtractFileName(AFilename)).InvokeVerb(LVerb);
  except
    Result := False;
    ShowExceptionMessage;
  finally
    ILFree(LPIDL);
  end;
end;
Код:
function PinToStartMenu(const AFilename: string; AIsPin: Boolean): Boolean;
// AFilename : full path to exe- or lnk-file
// AIsPin    : False - unpin from StartMenu, True - pin to StartMenu
var
  LShellApp, LFolderItem: Variant;
  LVerb, LnkName: string;
begin
  Result := False;
  if not FileExists(AFilename) then Exit;
  try
    LShellApp := CreateOleObject('Shell.Application');
    LFolderItem := LShellApp.Windows.Item.Document.Application
      .NameSpace(ExtractFileDir(AFilename))
      .ParseName(ExtractFileName(AFilename));
    { Below Windows 8. }
    if GetWindowsVersion < $06020000 then
    begin
      if AIsPin then
        LVerb := 'startpin' else
        LVerb := 'startunpin';
      LFolderItem.InvokeVerb(LVerb);
      Result := True;
    end else
    { Windows 8 and above. }
    begin
      if not LFolderItem.IsLink then
      begin
        LnkName := LFolderItem.ExtendedProperty('FileDescription');
        if LnkName = '' then
          LnkName := ExtractFileName(AFilename);
        LnkName := ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
        if AIsPin then
          Result := not FileExists(LnkName) and
            FileExists(CreateShellLink(LnkName, '', AFilename, '', '', '', 0, SW_SHOWNORMAL))
        else
          Result := DeleteFile(LnkName);
      end else
      begin
        LnkName := ExpandConstant('{commonprograms}\') + ExtractFileName(LFolderItem.Path);
        if AIsPin then
          Result := not FileExists(LnkName) and
            FileCopy(LFolderItem.Path, LnkName, False)
        else
          Result := DeleteFile(LnkName);
      end;
    end;
  except
    ShowExceptionMessage;
  end;
end;
 

Вложения

SBalykov

Старожил
Хамик
Нашел, как мне кажется, нормальное решение.
Поменял местами строки Win10 и Win7.
Теперь нормально работает на обеих системах.
 

Вложения

Хамик

Старожил
Хамик
Нашел, как мне кажется, нормальное решение.
Поменял местами строки Win10 и Win7.
Теперь нормально работает на обеих системах.
ошибка только в режиме отладки. В примере готовый экзешник setup.exe, никаких ошибок при работе нет. проверял Win7/Win10.
 
Последнее редактирование:
Сверху