Я использую отличный установщик Inno Setup и замечаю, что некоторые приложения (часто от Microsoft) устанавливаются со значком запуска, который уже хорошо виден («закреплен?») В меню «Пуск» (в Windows 7). Полностью ли я полагаюсь на последний использованный алгоритм, чтобы мой значок был «большим» в меню «Пуск», или есть способ продвинуть мое приложение с помощью установщика, пожалуйста?
Можно ли «закрепить в меню« Пуск »» с помощью Inno Setup?
Ответы (3)
Прикреплять программы можно, но не официально. На основе кода, опубликованного в _ 1_ (который использует тот же способ, что и описанный в статье, на которую ссылается @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 '[email protected] 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
объект, затем получает _5 _ и для этого объекта выполняет итерацию всех доступных глаголов и проверяет, совпадает ли их имя с именем, прочитанным из таблицы строк библиотеки Shell32.dll
. Если это так, он вызывает действие элемента команды, вызывая _ 7_ и завершает итерацию.
Вот возможное использование приведенного выше кода для закрепления:
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, где я его тестировал), это действительно хакерский способ, поскольку не существует официального способа программно закрепить программы на панели задач или в меню «Пуск». Это то, что пользователи должны делать по собственному выбору.
I would use post install step
.
- person TLama; 04.02.2015
this helper function
. Он возвращает True, если вы используете Windows Vista или выше, в противном случае - False.
- person TLama; 05.02.2015
Есть причина, по которой нет программного способа для закрепления чего-либо на панель задач / меню «Пуск». По своему опыту я видел, как в меню «Пуск» выделяются только что созданные ярлыки, и они предназначены именно для этой ситуации. Когда вы видите, что недавно установленная программа отображается в меню «Пуск», это, вероятно, связано с этим алгоритмом, а не потому, что установщик поместил ее туда.
Тем не менее, если новый ярлык не выделяется, это может быть связано с тем, что установщик извлекает уже существующий ярлык и сохраняет на нем старую метку времени, а не использует функцию API для создания ярлыка в стартовое меню.
Взгляните на: http://blogs.technet.com/deploymentguys/archive/2009/04/08/pin-items-to-the-start-menu-or-windows-7-taskbar-via-script.aspx