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

Дамир

Новичок
Можно как то закрепить ярлык на панели задач без использования vbs скрипта который есть в примерах? Почему не срабатывает стандартный вариант inno setup?
 

Хамик

Старожил
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "pin"; Description: "Закрепить ярлык на панели задач"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5 Ultra\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

[Code]
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

    { String resources }
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;        { Pin to Tas&kbar }
    end else res := 5387;   { Unpin from Tas&kbar }

    { Load string resource }
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;

procedure CurPageChanged(CurPageID: integer);
begin
  case CurPageID of
    wpFinished: begin
        if IsTaskSelected('Pin') then
        PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), True);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  instPath: string;
begin
    case CurUninstallStep of
      usUninstall: begin
        PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), False);
      end;
   end;
end;
 
Последнее редактирование:

Дамир

Новичок
Хамик, моя ошибка, не заметил что имя таска обязательно должно быть pin, поэтому и не крепился, спасибо!
 

AlexS

Новичок
Хамик, нужна твоя помощь по выше данному коду. Пытаюсь прикрутить его к своему и не могу, в виду того, что секцию [Tasks] отключил. Хочу прикрутить на свою кастомную страницу и не выходит. Коротко о моем скрипте: есть страница с названием "CustomPage", на ней чекбокс с названием "Закрепить ярлык на панели задач". Помоги пожалуйста с решением этой задачи. Буду очень признателен.
 

vint56

Ветеран
Проверенный
AlexS,
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

;[Tasks]
;Name: "pin"; Description: "Закрепить ярлык на панели задач"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

Код:
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

    { String resources }
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;        { Pin to Tas&kbar }
    end else res := 5387;   { Unpin from Tas&kbar }

    { Load string resource }
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;

var
  MyPage: TWizardPage;
  ToTaskbar: TNewCheckBox;

procedure InitializeWizard();
begin
 MyPage := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
 ToTaskbar := TNewCheckBox.Create(WizardForm);
  with ToTaskbar do
  begin
    Parent := MyPage.Surface;
    Left := ScaleX(88);
    Top := ScaleY(80);
    Width := ScaleX(233);
    Height := ScaleY(17);
    Caption := 'Закрепить ярлык на панели задач';
  end;
end;


procedure CurPageChanged(CurPageID: integer);
begin
  case CurPageID of
    wpFinished: begin
        if ToTaskbar.Checked then
        PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), True);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  instPath: string;
begin
    case CurUninstallStep of
      usUninstall: begin
        PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), False);
      end;
   end;
end;
[/SPOILER]
 

AlexS

Новичок
Прикрутил. Результат нулевой.
Самое странное, что ошибок не выдает. Компилируется без проблем, устанавливается тоже, но не закрепляется...
 

AlexS

Новичок
Разобрался!!! Оказалось, что из-за отключённой финишной страницы. Если в секции [Setup] есть директива DisableFinishedPage=yes, то закрепления ярлыка на панели задач не происходит...
 

SBalykov

Старожил
Разобрался!!! Оказалось, что из-за отключённой финишной страницы. Если в секции [Setup] есть директива DisableFinishedPage=yes, то закрепления ярлыка на панели задач не происходит...
А что мешает сделать при отключенной странице так:
Код:
procedure CurStepChanged(CurStep: TSetupStep);
begin
   case CurStep of
   ssPostInstall : begin
     if ToTaskbar.Checked then PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), True);
   end;
end;
 

AlexS

Новичок
Спасибо большое, сработало с отключённой финишной страницей
 

agrei678

Новичок
Хамик,
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "pin"; Description: "Закрепить ярлык на панели задач"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5 Ultra\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

[Code]
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

    { String resources }
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;        { Pin to Tas&kbar }
    end else res := 5387;   { Unpin from Tas&kbar }

    { Load string resource }
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;

procedure CurPageChanged(CurPageID: integer);
begin
  case CurPageID of
    wpFinished: begin
        if IsTaskSelected('Pin') then
        PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), True);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  instPath: string;
begin
    case CurUninstallStep of
      usUninstall: begin
        PinToTaskbar(ExpandConstant('{app}\MyProg.exe'), False);
      end;
   end;
end;
Приветствую всех, прошу навыков и знаний инженеров, ярлык закрепляется прекрасно в Windows 7 ,а как закрепить в Win 10? ,закрепляется почему-то не в панели а в меню пуск , что где подправить?
 
Последнее редактирование:

Хамик

Старожил
а как закрепить в Win 10?
Обновленные варианты от El Sanchez:
Код:
function PinToTaskbar(const FileName: string; IsPin: Boolean): Boolean;
// FileName : full path to executable file
// IsPin    : False - unpin from TaskBar, True - pin to TaskBar
var
  ShellApp: Variant;
  Verb: string;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  try
    if IsPin then
      Verb := 'taskbarpin' else
      Verb := 'taskbarunpin';
    ShellApp := CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName)).InvokeVerb(Verb);
    Result := True;
  except
    ShowExceptionMessage;
  end;
end;
Код:
function PinToStartMenu(const FileName: string; const IsPin: Boolean): Boolean;
// FileName : full path to exe- or lnk-file
// IsPin    : False - unpin from StartMenu, True - pin to StartMenu
var
  ShellApp, FolderItem: Variant;
  Verb, LnkName: string;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  try
    ShellApp := CreateOleObject('Shell.Application');
    FolderItem := ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFileName(FileName));
    if GetWindowsVersion < $06020000 then // below Windows 8
    begin
      if IsPin then
        Verb := 'startpin' else
        Verb := 'startunpin';
      FolderItem.InvokeVerb(Verb);
      Result := True;
    end
    else  // Windows 8 and above
    begin
      if not FolderItem.IsLink then
      begin
        LnkName := FolderItem.ExtendedProperty('FileDescription');
        if LnkName = '' then
          LnkName := ExtractFileName(FileName);
        LnkName := ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
        if IsPin then
          Result := not FileExists(LnkName) and
            FileExists(CreateShellLink(LnkName, '', FileName, '', '', '', 0, SW_SHOWNORMAL))
        else
          Result := DeleteFile(LnkName);
      end
      else
      begin
        LnkName := ExpandConstant('{commonprograms}\') + ExtractFileName(FolderItem.Path);
        if IsPin then
          Result := not FileExists(LnkName) and
            FileCopy(FolderItem.Path, LnkName, False)
        else
          Result := DeleteFile(LnkName);
      end;
    end;
  except
    ShowExceptionMessage;
  end;
end;
 

agrei678

Новичок
Хамик, Что-то не получается ярлыка в панели совсем не видать :rolleyes:
#define FileName "Степаныч"
#define PROGVerName "Степаныч [v 1.9.4.5]"

#define NeedSize "6315"

#define Processor "3000"
#define VideoCard "128"
#define RAM "512"
#define WinVerMajor "5"
#define WinVerMinor "1"
#define ServicePack "2"

#define ArcLocation "{src}\*.arc"

#define Splash /* Откл. или вкл. Splash (ЛОГОтип) */

[Setup]
//AppId={#PROGID}
AppName={#FileName}
AppVerName={#FileName}
AppPublisher=123
AppPublisherURL=http://
AppVersion=1.0
AppSupportURL={app}\Support\Help\Ru\HELP_RU.htm
AppUpdatesURL=http://www.123.com/downloads
AppReadmeFile={group}\ReadMe.lnk
DefaultDirName={pf}\Степаныч
DefaultGroupName=Степаныч
OutputBaseFilename=Степаныч
DisableReadyPage=yes
DirExistsWarning=no
MinVersion=1,0
VersionInfoDescription={#FileName}
SetupIconFile=FILESS\0.ico
DiskSpanning=yes
SlicesPerDisk=3
DiskSliceSize=1566000000
//DisableReadyPage=True
InternalCompressLevel=ultra64
SolidCompression=true
Compression=lzma/ultra64

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "pin"; Description: "Закрепить ярлык на панели задач"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "FILESS\optimize.exe"; DestDir: "{app}"; Flags: ignoreversion

//-----------------------------------------------------------------
//////// ЛОГОТИП в НАЧАЛЕ УСТАНОВКИ //////
#ifdef Splash
Source: "FILESS\isgsg.dll"; DestDir:"{tmp}\uninst_tmp"; Flags: ignoreversion
Source: "FILESS\CCCP.png"; DestDir:"{tmp}\uninst_tmp"; Flags: ignoreversion
#endif
//-----------------------------------------------------------------

//-----------------------------------------------------------------
////////////// замена вида папки на иконку //////////////
Source: FILESS\Desktop.ini; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: FILESS\Desktop.ini; DestDir: {group}; Flags: ignoreversion; Attribs: hidden system
Source: FILESS\0.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: FILESS\0.ico; DestDir: {group}; Flags: ignoreversion; Attribs: hidden system
//-----------------------------------------------------------------


[Icons]
//-----------------------------------------------------------------
////////////// ярлыки в меню пуск //////////////////
Name: "{group}\Запустить {#FileName}"; Filename: "{app}\optimize.exe"
Name: "{group}\удалить {#PROGVerName}"; Filename: "{app}\unins000.exe"
//-----------------------------------------------------------------
////////////// автоматически создаёт ярлык на рабочем столе //////////////////
Name: "{commondesktop}\{#FileName}"; Filename: "{app}\optimize.exe"; Comment: "{#FileName}"; IconFilename: "{app}\optimize.exe"
//Name: "{userdesktop}\{#FileName}"; Filename: "{app}\optimize.exe"; WorkingDir: {app}; Check: NoIcons
//-----------------------------------------------------------------

//-----------------------------------------------------------------
////////////// замена вида папки на иконку (вставлять только после команды [Icons] ато ничего не получится) //////////////
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}
[Dirs]
Name: {app}; attribs: readonly
Name: {group}; attribs: readonly
[INI]
//FileName: "{app}\publisher.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.123.com";
//FileName: "{app}\Update.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.123.com/downloads";
filename: {app}\Desktop.ini; section: .ShellClassInfo; key: IconFile; string: {app}\0.ico
filename: {app}\Desktop.ini; section: .ShellClassInfo; key: IconIndex; string: 0
filename: {group}\Desktop.ini; section: .ShellClassInfo; string: {app}\0.ico; key: IconFile
filename: {group}\Desktop.ini; section: .ShellClassInfo; key: IconIndex; string: 0
//-----------------------------------------------------------------

[UninstallDelete]
//Type: files; Name: "{app}\publisher.url"
//Type: files; Name: "{app}\Update.url"
Type: filesandordirs; Name: {app}

Код:
//  ------------  ЛОГО в Начале установки  ------------  //
procedure ShowSplashScreen(p1: HWND; p2: AnsiString; p3, p4, p5, p6, p7: Integer; p8: Boolean; p9: Cardinal; p10: Integer);
  external 'ShowSplashScreen@{tmp}\isgsg.dll stdcall delayload';

procedure Splash();
begin
  ExtractTemporaryFile('isgsg.dll');
  ExtractTemporaryFile('CCCP.png');
  ShowSplashScreen(WizardForm.Handle, ExpandConstant('{tmp}\CCCP.png'), 1000, 3000, 1000, 0, 255, False, $FFFFFF, 10);
end;

procedure InitializeWizard;
begin
  #ifdef Splash
  Splash();
  #endif
end;

//  ------------  КОНЕЦ  ЛОГО  ------------  //


function PinToTaskbar(const filename: string; IsPin: Boolean): Boolean;
// FileName : full path to executable file
// IsPin    : False - unpin from TaskBar, True - pin to TaskBar
var
  ShellApp: Variant;
  Verb: string;
begin
  Result := False;
  if not FileExists(filename) then Exit;
  try
    if IsPin then
      Verb := 'taskbarpin' else
      Verb := 'taskbarunpin';
    ShellApp := CreateOleObject('Shell.Application');
    ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(filename)).ParseName(ExtractFileName(filename)).InvokeVerb(Verb);
    Result := True;
  except
    ShowExceptionMessage;
  end;
end;
[/SPOILER]
 

Хамик

Старожил
agrei678, Функцию вы то вставили, а где сам вызов функции?
Судя по коду вам нужно что-то типа такого:
Код:
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
    begin
      if IsTaskSelected('pin') then PinToTaskbar(ExpandConstant('{app}\optimize.exe'), true); //закрепить ярлык
    end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    begin
      PinToTaskbar(ExpandConstant('{app}\optimize.exe'), false); //открепить ярлык
    end;
end;
 

agrei678

Новичок
Хамик, не выходит ,ошибка PinToTaskbar (я в скриптах и в программировании не шарю, я так на авось методом тыка :).)

#define PROGName "Степаныч"
#define PROGVerName "Степаныч [v 1.9.4.5]"


#define NeedSize "6315"

#define Processor "3000"
#define VideoCard "128"
#define RAM "512"
#define WinVerMajor "5"
#define WinVerMinor "1"
#define ServicePack "2"

#define ArcLocation "{src}\*.arc"

#include "botva22.iss"
#define Splash /* Откл. или вкл. Splash (ЛОГОтип) */


[Setup]
AppName={#PROGName}
AppVerName={#PROGName}
AppPublisher=Electronic Arts
AppPublisherURL=http://www.123.com
AppVersion=1.0.1.17
AppSupportURL={app}\Help\HELP_RU.htm
AppUpdatesURL=http://www.123.com/downloads
AppReadmeFile={group}\ReadMe.lnk
DefaultDirName={pf}\Games
DefaultGroupName=Games
OutputBaseFilename=Stepanich
DisableReadyPage=yes
DirExistsWarning=no
MinVersion=0,5.01
VersionInfoDescription={#PROGName}
SetupIconFile=FILESS\0.ico
DiskSpanning=yes
SlicesPerDisk=3
//DiskSliceSize=1566000000
//DisableReadyPage=True
InternalCompressLevel=ultra64
SolidCompression=true
Compression=lzma/ultra64

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "InstallFiles\*"; Flags: dontcopy;

Source: botva2.dll; Flags: dontcopy
Source: button.png; Flags: dontcopy
Source: CallbackCtrl.dll; Flags: dontcopy
//-----------------------------------------------------------------
//////// ЛОГОТИП в НАЧАЛЕ УСТАНОВКИ //////
#ifdef Splash
Source: "InstallFiles\isgsg.dll"; DestDir:"{tmp}\uninst_tmp"; Flags: ignoreversion
Source: "InstallFiles\CCCP.png"; DestDir:"{tmp}\uninst_tmp"; Flags: ignoreversion
#endif
//-----------------------------------------------------------------
Source: "FILESS\Optimize.exe"; DestDir: "{app}"; Flags: ignoreversion

//-----------------------------------------------------------------
////////////// замена вида папки на иконку //////////////
Source: FILESS\Desktop.ini; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: FILESS\Desktop.ini; DestDir: {group}; Flags: ignoreversion; Attribs: hidden system
Source: FILESS\0.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: FILESS\0.ico; DestDir: {group}; Flags: ignoreversion; Attribs: hidden system
//-----------------------------------------------------------------
//-----------------------------------------------------------------









////////////// замена вида папки на иконку (вставлять только после команды [Icons] ато ничего не получится) //////////////
[Tasks]
// чтоб убрать чекбокс в конце строк нужно вставить то-что в кавычках ( ; Flags: unchecked )
Name: desktopicon; Description: {cm:CreateDesktopIcon}
Name: "pin"; Description: "Закрепить ярлык на панели задач"; GroupDescription: "{cm:AdditionalIcons}"

[Dirs]
Name: {app}; attribs: readonly
Name: {group}; attribs: readonly
[INI]
//FileName: "{app}\publisher.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.ea.com";
//FileName: "{app}\Update.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.needforspeed.com/downloads";
filename: {app}\Desktop.ini; section: .ShellClassInfo; key: IconFile; string: {app}\0.ico
filename: {app}\Desktop.ini; section: .ShellClassInfo; key: IconIndex; string: 0
filename: {group}\Desktop.ini; section: .ShellClassInfo; string: {app}\0.ico; key: IconFile
filename: {group}\Desktop.ini; section: .ShellClassInfo; key: IconIndex; string: 0
//-----------------------------------------------------------------












[Icons]
//-----------------------------------------------------------------
////////////// ярлыки в меню пуск //////////////////
Name: "{group}\Запустить {#ProgName}"; Filename: "{app}\optimize.exe"
Name: "{group}\удалить {#PROGVerName}"; Filename: "{app}\unins000.exe"
//-----------------------------------------------------------------
////////////// автоматически создаёт ярлык на рабочем столе //////////////////
Name: "{commondesktop}\{#ProgName}"; Filename: "{app}\optimize.exe"; Comment: "{#PROGName}"; IconFilename: "{app}\optimize.exe"
//Name: "{userdesktop}\{#PROGName}"; Filename: "{app}\optimize.exe"; WorkingDir: {app}; Check: NoIcons
//-----------------------------------------------------------------











[UninstallDelete]
//Type: files; Name: "{app}\publisher.url"
//Type: files; Name: "{app}\Update.url"
Type: filesandordirs; Name: {app}


Код:
var
    hTestBtn:HWND;



//  ------------  ЛОГО в Начале установки  ------------  //
procedure ShowSplashScreen(p1: HWND; p2: AnsiString; p3, p4, p5, p6, p7: Integer; p8: Boolean; p9: Cardinal; p10: Integer);
  external 'ShowSplashScreen@{tmp}\isgsg.dll stdcall delayload';

procedure Splash();
begin
  ExtractTemporaryFile('isgsg.dll');
  ExtractTemporaryFile('CCCP.png');
  ShowSplashScreen(WizardForm.Handle, ExpandConstant('{tmp}\CCCP.png'), 1000, 3000, 1000, 0, 255, False, $FFFFFF, 10);
end;

//  ------------  КОНЕЦ  ЛОГО  ------------  //


procedure TestBtn2Click(hBtn:HWND);
//выполняется при нажатии на кнопку с хэндлом hTestBtn
var
    ErrorCode: Integer;
begin
    ShellExec('open', 'www.Yandex.ru', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

function InitializeSetup:boolean;
begin
    if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
    if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
    Result:=True;
end;

procedure InitializeWizard;
var
    h:HWND;
    i,l1:integer;
begin
    hTestBtn:=BtnCreate(WizardForm.Handle,0,315,85,30,'button.png',1,False);
    BtnSetEvent(hTestBtn,BtnClickEventID,WrapBtnCallback(@TestBtn2Click,1));
    BtnSetFontColor(hTestBtn,clblack,clblack,clblack,clgray);
    BtnSetText(hTestBtn,'Yandex.RU');
//   Вставляем где есть строка с << procedure InitializeWizard; >>   ищем в скрипте её
//   Потом строка << var >>
//   Потом строка << begin >>   после этих строк вставляем << Splash >>
  #ifdef Splash
  Splash();
  #endif
//   КОНЕЦ Splash
end;

procedure DeinitializeSetup();
begin
    gdipShutdown;
end;













///////////// в панель задачь
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;

var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

    { String resources }
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;        { Pin to Tas&kbar }
    end else res := 5387;   { Unpin from Tas&kbar }

    { Load string resource }
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;

procedure CurPageChanged(CurPageID: integer);
begin
  case CurPageID of
    wpFinished: begin
        if IsTaskSelected('Pin') then
        PinToTaskbar(ExpandConstant('{app}\Optimize.exe'), True);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  instPath: string;
begin
    case CurUninstallStep of
      usUninstall: begin
        PinToTaskbar(ExpandConstant('{app}\Optimize.exe'), False);
      end;
   end;
end;
/////////////////  конец панель


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
    begin
      if IsTaskSelected('pin') then PinToTaskbar(ExpandConstant('{app}\optimize.exe'), true); //закрепить ярлык
    end;
end;

[/SPOILER]
 
Последнее редактирование:
Сверху