PDA

Показать полную графическую версию : [решено] Создание ярлыка с помощью VBS


Страниц : 1 2 [3] 4

omegastripes
22-02-2014, 22:57
а можете обратный код написать, чтобы извлекал ярлык с панели задач? »
Код, собственно, можно использовать тот же, просто вместо строки
If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
поменять желаемое действие на "Открепить от":
If VerbName = "Открепить от панели задач" Then
Для моей версии Win7HB вышеуказанное название действия появляется в контекстном меню закрепленного на панели задач файла. Для других версий и языковых пакетов я, к сожалению, не подскажу. Естественно, если названия для тех версий не прописать, то скрипт в них не будет функционировать.

Dodakaedr
29-06-2014, 15:43
Iska, Здравствуйте! Нужна Ваша помочь. Можете изменить скрипт чтобы он закреплял ярлык в меню пуск?http://savepic.net/5846014m.jpg (http://savepic.net/5846014.htm)
If WScript.Arguments.Count <> 1 Then
MsgBox "Drag'n'drop exe file to pin to taskbar", , "bla-bla"
WScript.Quit
End If

strPath = WScript.Arguments(0)
Set objShell = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))

If objFolderItem Is Nothing Then
MsgBox strPath & vbCrLf & "not found", , "bla-bla"
WScript.Quit
End If

Set colVerbs = objFolderItem.Verbs

bPinned = False
For Each objVerb In colVerbs
VerbName = Replace(objVerb.Name, "&", "")
If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
objVerb.DoIt
bPinned = True
Exit For
End If
Next

Dodakaedr
01-07-2014, 21:52
Помогите кто-нибудь с предыдущим постом.

morozoff
01-07-2014, 22:55
Dodakaedr, Посмотрите в этой (http://forum.oszone.net/nextoldesttothread-223842.html) теме. Там есть VBS-скрипты для закрепления на панели задач и закрепления в меню пуск.

Dodakaedr
02-07-2014, 01:14
morozoff, тот пример не подходит, мне нужен как у меня только чтобы закреплял в меню "Пуск".

omegastripes
06-07-2014, 01:20
Dodakaedr, вот, все аналогично первому скрипту, сохраняйте в виде файла .vbs:
If WScript.Arguments.Count <> 1 Then
MsgBox "Перетащите файл, чтобы закрепить его в меню ""Пуск""", , "Закрепление ярлыка в меню ""Пуск"""
WScript.Quit
End If

strPath = WScript.Arguments(0)

If MsgBox("Закрепить ярлык на [" & strPath & "] в меню ""Пуск""?", vbYesNo + vbInformation, "Закрепление ярлыка в меню ""Пуск""") = vbYes Then
Set objShell = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))

If objFolderItem Is Nothing Then
MsgBox strPath & vbCrLf & "Файл не найден", , "Закрепление ярлыка в меню ""Пуск"""
WScript.Quit
End If

Set colVerbs = objFolderItem.Verbs

bPinned = False
For Each objVerb In colVerbs
VerbName = Replace(objVerb.Name, "&", "")
If VerbName = "Закрепить в меню ""Пуск""" Or VerbName = "Pin to Start Menu" Then
objVerb.DoIt
bPinned = True
Exit For
End If

Next

If bPinned Then
Msgbox "Ярлык закреплен", vbOKOnly + vbInformation, "Закрепление ярлыка в меню ""Пуск"""
Else
Msgbox "Ошибка закрепления ярлыка", vbOKOnly + vbCritical, "Закрепление ярлыка в меню ""Пуск"""
End If
End If

Предвосхищая следующий вопрос - "Как убрать ярлык из меню Пуск?", отвечу: в тексте скрипта выше нужно заменить вот эту строку:
If VerbName = "Закрепить в меню ""Пуск""" Or VerbName = "Pin to Start Menu" Then
на строку
If VerbName = "Изъять из меню ""Пуск""" Or VerbName = "Unpin from Start Menu" Then
Ну и по тексту посмотреть - где было "...закрепить..." - заменить на "...изъять...".

P.S.: Напомню, что в зависимости от локализации эти скрипты могут легко Вас подвести. Пока что учтены имена действий только на русском и английском. В идеале нужно бы найти некий системный ресурс, который для всех языковых пакетов находился бы в одном и том же месте, и по определенному индексу из него можно было бы извлечь нужное название действия именно для текущей локализации.

Dodakaedr
06-07-2014, 19:36
omegastripes, Огромное Спасибо!

Dodakaedr
09-04-2016, 20:12
Подскажите, пожалуйста, как нужно указать файл с параметром, например такой: MyProg.exe /Remчтобы ярлык закреплялся с параметром запуска программы.
Пробовал по разному не работает.

[run]
Filename: "{tmp}\1.vbs"; Parameters: """{app}\MyProg.exe /Rem"""; Flags: shellexec waituntilterminated;


[run]
Filename: "{tmp}\1.vbs"; Parameters: """{app}\MyProg.exe"" /Rem"; Flags: shellexec waituntilterminated;

Iska
09-04-2016, 21:26
Dodakaedr, это что? Скрипт установки InnoSetup?

Dodakaedr
09-04-2016, 21:43
Iska, да

Dodakaedr
10-04-2016, 20:11
Iska, есть какие-нибудь идеи?

Iska
10-04-2016, 20:55
Dodakaedr, тут не идеи нужны. Надо загрузить InnoSetup+редактор, создать инсталляцию, запустить её и отследить, что происходит.

Dodakaedr
10-04-2016, 20:59
Iska, если указывать параметр то скрипт не видит файл.

Iska
11-04-2016, 00:54
Dodakaedr, ото ж ;).

Давайте попробуем так: сначала прикрепляем ярлык на Панель задач, затем добавляем к нему аргумент.

Добавьте в секцию скрипта инсталляции следующий код:
[code]//the function is work well on Unicode Inno Setup,
//if Non Unicode Inno Setup, one need to modify,
//and I think you can do it!
//Inno use Win32 API
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;

sFileName = 'Program.exe';

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function LoadLibrary(lpFilename : String) : LongInt;
external 'LoadLibrary{#A}@kernel32.dll stdcall delayload'; //if Non Unicode Inno Setup, use LoadLibraryA
function FreeLibrary(hModule : LongInt) : BOOL;
external 'FreeLibrary@kernel32.dll stdcall delayload';
function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;
external 'LoadString{#A}@user32.dll stdcall delayload'; //if Non Unicode Inno Setup, use LoadStringA

//here is the function
//@param strPath The App's directory,
//@param strApp The App's name
//@example zylPinAppToTaskbar('c:\window', 'notepad.exe');
procedure zylPinAppToTaskbar(strPath, strApp: string);
var
vShell, vFolder, vFolderItem, vItemVerbs: Variant;
vPinnedShortcutFileName: Variant;
vWshShell, vShellLink: Variant;
vPath, vApp: Variant;
i: Integer;
sItem: String;
h: LongInt;
szPinName: String;
filenameEnd : Integer;
filename : String;
strEnd : String;
begin
SetLength(szPinName, 255);
h := LoadLibrary(ExpandConstant('{sys}\Shell32.dll'));
LoadString(h, SHELL32_STRING_ID_PIN_TO_TASKBAR, szPinName, 255); //pin to taskbar text
FreeLibrary(h);
strEnd := #0;
filenameEnd := Pos(strEnd, szPinName);
filename := Copy(szPinName, 1, filenameEnd - 1);
if (Length(filename) > 0) then //WinXp or lower, no pin taskbar function
begin
vShell := CreateOleObject('Shell.Application');
vPath := strPath;
vFolder := vShell.NameSpace(vPath);
vApp := strApp;
vFolderItem := vFolder.ParseName(vApp);
vItemVerbs := vFolderItem.Verbs;
for i := 1 to vItemVerbs.Count do
begin
sItem := vItemVerbs.Item(i).Name;
if (sItem = filename) then
begin
// 63 63 72 75 6E 2E 63 6F 6D
vItemVerbs.Item(i).DoIt;
vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + vFolder.GetDetailsOf(vFolderItem, 34) + '.lnk';
if (FileExists(vPinnedShortcutFileName)) then
begin
vWshShell := CreateOleObject('Wscript.Shell');
vShellLink := vWshShell.CreateShortcut(vPinnedShortcutFileName);
vShellLink.Arguments := '/Rem';
vShellLink.Save();
end;
break;
end;
end;
end;
end;

//You can use zylPinAppToTaskbar like this
procedure CurPageChanged(CurPageID: Integer);
begin
//When Finished page is shown, call the function
//You can also call is when the "Finish" button clicked.
if CurPageID = wpFinished then
begin
if IsTaskSelected('pintaskbar') then
zylPinAppToTaskbar(ExpandConstant('{app}'), sFileName);
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
vShell, vFolder, vFolderItem: Variant;
vPinnedShortcutFileName: Variant;
begin
if CurUninstallStep = usUninstall then
begin
vShell := CreateOleObject('Shell.Application');
vFolder := vShell.NameSpace(ExpandConstant('{app}'));
vFolderItem := vFolder.ParseName(sFileName);
vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + vFolder.GetDetailsOf(vFolderItem, 34) + '.lnk';
UnpinShellLink(vPinnedShortcutFileName);
end;
end;

Укажите вместо «Program.exe» имя Вашего «MyProg.exe». У меня под Windows 7 работает. Под более новыми версиями, полагаю, могут быть проблемы из-за номера свойства Проводника «Описание файла» (или отсутствия описания).

P.S. По-хорошему, надо попробовать закреплять не сам исполняемый файл из %ProgramFiles%, а ярлык на него, созданный в Главном меню в процессе инсталляции (уже со всеми потребными параметрами).

Iska
11-04-2016, 06:40
Ну, вот, попробовал:
//the function is work well on Unicode Inno Setup,
//if Non Unicode Inno Setup, one need to modify,
//and I think you can do it!
//Inno use Win32 API
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;

sFileName = 'ShortcutName.lnk';

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
function LoadLibrary(lpFilename : String) : LongInt;
external 'LoadLibrary{#A}@kernel32.dll stdcall delayload'; //if Non Unicode Inno Setup, use LoadLibraryA
function FreeLibrary(hModule : LongInt) : BOOL;
external 'FreeLibrary@kernel32.dll stdcall delayload';
function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;
external 'LoadString{#A}@user32.dll stdcall delayload'; //if Non Unicode Inno Setup, use LoadStringA

//here is the function
//@param strPath The App's directory,
//@param strApp The App's name
//@example zylPinAppToTaskbar('c:\window', 'notepad.exe');
procedure zylPinAppToTaskbar(strPath, strApp: string);
var
vShell, vFolder, vFolderItem, vItemVerbs: Variant;
vPath, vApp: Variant;
i: Integer;
sItem: String;
h: LongInt;
szPinName: String;
filenameEnd : Integer;
filename : String;
strEnd : String;
begin
SetLength(szPinName, 255);
h := LoadLibrary(ExpandConstant('{sys}\Shell32.dll'));
LoadString(h, SHELL32_STRING_ID_PIN_TO_TASKBAR, szPinName, 255); //pin to taskbar text
FreeLibrary(h);
strEnd := #0;
filenameEnd := Pos(strEnd, szPinName);
filename := Copy(szPinName, 1, filenameEnd - 1);
if (Length(filename) > 0) then //WinXp or lower, no pin taskbar function
begin
vShell := CreateOleObject('Shell.Application');
vPath := strPath;
vFolder := vShell.NameSpace(vPath);
vApp := strApp;
vFolderItem := vFolder.ParseName(vApp);
vItemVerbs := vFolderItem.Verbs;
for i := 1 to vItemVerbs.Count do
begin
sItem := vItemVerbs.Item(i).Name;
if (sItem = filename) then
begin
// 63 63 72 75 6E 2E 63 6F 6D
vItemVerbs.Item(i).DoIt;
break;
end;
end;
end;
end;

//You can use zylPinAppToTaskbar like this
procedure CurPageChanged(CurPageID: Integer);
begin
//When Finished page is shown, call the function
//You can also call is when the "Finish" button clicked.
if CurPageID = wpFinished then
begin
if IsTaskSelected('pintaskbar') then
zylPinAppToTaskbar(ExpandConstant('{group}'), sFileName);
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
vShell, vFolder: Variant;
vPinnedShortcutFileName: Variant;
begin
if CurUninstallStep = usUninstall then
begin
vShell := CreateOleObject('Shell.Application');
vFolder := vShell.NameSpace(ExpandConstant('{app}'));
vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + sFileName;
UnpinShellLink(vPinnedShortcutFileName);
end;
end;

«ShortcutName» — имя ярлыка, создаваемого в разделе ярлыков [Icons] скрипта инсталляции с параметром «/Rem», наподобие:
Name: "{group}\ShortcutName"; Filename: "{app}\Program.exe"; WorkingDir: "{app}"; IconFilename: "{app}\Program.exe"; Parameters: "/Rem"

Dodakaedr
11-04-2016, 14:10
Iska, не могу скомпилировать, неизвестный идентификатор UnpinShellLink. Чему он должен быть равен?
У меня китайская расширенная версия компилятора.

Iska
11-04-2016, 14:24
Iska, не могу скомпилировать, неизвестный идентификатор UnpinShellLink. Чему он должен быть равен? »
Это стандартная функция:
Pascal Scripting: UnpinShellLink

Prototype:
function UnpinShellLink(const Filename: String): Boolean;

Description:
Attempt to unpin the shortcut with the specified filename. Returns True if the shortcut was successfully removed from the list of pinned items and/or the taskbar, or if the shortcut was not pinned at all.

В принципе, для UnPin'а можно было бы написать свою, по аналогии с процедурой zylPinAppToTaskbar(), но зачем?!

У меня китайская расширенная версия компилятора. »
Возьмите последнюю официальную.

Dodakaedr
11-04-2016, 14:38
В принципе, для UnPin'а можно было бы написать свою, по аналогии с процедурой zylPinAppToTaskbar(), но зачем?! »
в моем случаи очень бы пригодилось.
Возьмите последнюю официальную. »
не вариант, у меня используется много других функций, которые не работают на официальной версии.

Iska
11-04-2016, 18:15
Dodakaedr, тогда берите последний код — и с ним сюда: Скрипты Inno Setup. Помощь и советы [часть 8] (http://forum.oszone.net/thread-294838.html). Кто-нибудь да сделает, там делов не на много. В качестве параметров для планируемой функции UnPin() должны передаваться те же параметры путь/имя на исходный ярлык в Главном меню (а не на сам прикреплённый ярлык).

Dodakaedr
12-04-2016, 15:25
Iska, если брать сам ярлык, то можно воспользоватся и vbs скриптом, проверил работает, только для "полного счастья" нужен обратный код, то есть открепления...




© OSzone.net 2001-2012