|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Закрепление ярлыка на панели задач
Как программно добавить ярлык на панель задач, так как это делает встроенная функция "Закрепить на панели задач"?
Создать ярлык в папке C:\Users\<Пользователь>\AppData\Roaming\Microsoft\ Internet Explorer\Quick Launch\User Pinned\TaskBar недостаточно, ярлык в папке появляется а на панели нет, видимо нужно еще какое то действие. Подскажите кто знает. |
#2
|
||||
|
||||
Цитата:
А самое обидное, это вот Цитата:
З.Ы. Нашёл вариант закрепления через скрипт.vbs (в архиве), 2.lnk - это ярлык на файл.exe, вызов происходит из-под ShellExecute Код:
uses ShellAPI; procedure TForm1.Button1Click(Sender: TObject); var h: hwnd; begin ShellExecute(h, 'open', 'c:\4.vbs', 'c:\2.lnk', nil, SW_HIDE); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 27.09.2017 в 20:19. |
#3
|
|||
|
|||
Через ShellExecute у меня есть PinTo10v2, тоже работает. Но хочется все одним файлом. У меня есть исходник PinTo10v2 но она на C#
Вот как она это делает: Код:
if (taskbar) { Utils.ChangeImagePathName("explorer.exe"); success = Utils.PinUnpinTaskbar(fileName, pin); if (success) Utils.RestoreImagePathName(); } Код:
public static bool PinUnpinTaskbar(string filePath, bool pin) { if (!System.IO.File.Exists(filePath)) { Console.WriteLine("\n\r" + "Specified file not found. Exiting..."); Environment.Exit(1); }; //throw new FileNotFoundException(filePath); int MAX_PATH = 255; var actionIndex = pin ? 5386 : 5387; // 5386 is the DLL index for"Pin to Tas&kbar", ref. http://www.win7dll.info/shell32_dll.html StringBuilder szPinToStartLocalized = new StringBuilder(MAX_PATH); IntPtr hShell32 = LoadLibrary("Shell32.dll"); LoadString(hShell32, (uint)actionIndex, szPinToStartLocalized, MAX_PATH); string localizedVerb = szPinToStartLocalized.ToString(); string path = Path.GetDirectoryName(filePath); string fileName = Path.GetFileName(filePath); // create the shell application object dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application")); dynamic directory = shellApplication.NameSpace(path); dynamic link = directory.ParseName(fileName); dynamic verbs = link.Verbs(); for (int i = 0; i < verbs.Count(); i++) { dynamic verb = verbs.Item(i); var name = verb.Name; //Console.WriteLine("Verb Name = " + name); if (verb.Name.Equals(localizedVerb)) { //Console.WriteLine("Trying to do it..."); verb.DoIt(); return true; } } return false; } Код:
internal static void ChangeImagePathName(string newFileName) { IntPtr imageOffset, imageBuffer; GetPointers(out imageOffset, out imageBuffer); //Read original data var imageLen = Marshal.ReadInt16(imageOffset); originalImagePathName = Marshal.PtrToStringUni(imageBuffer, imageLen / 2); var newImagePathName = Path.Combine(Path.GetDirectoryName(originalImagePathName), newFileName); if (newImagePathName.Length > originalImagePathName.Length) throw new Exception("new ImagePathName cannot be longer than the original one"); //Write the string, char by char var ptr = imageBuffer; foreach (var unicodeChar in newImagePathName) { Marshal.WriteInt16(ptr, unicodeChar); ptr = ptr.Increment(2); } Marshal.WriteInt16(ptr, 0); //Write the new length Marshal.WriteInt16(imageOffset, (short)(newImagePathName.Length * 2)); } PinUnpinTaskbar на Delphi будет как то так Код:
const LOAD_LIBRARY_AS_DATAFILE = $2; function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExA@kernel32.dll stdcall'; function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Byte; nBufferMax: Integer): Integer; external 'LoadStringA@user32.dll stdcall'; // function PinToTaskbar(Filename: String): Boolean; var hInst: THandle; buf: array [0..255] of byte; i: byte; strVerb, s: String; objShell, colverbs: Variant; begin if not FileExists(Filename) then Exit; if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then begin hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE); for i := 0 to LoadString(hInst, 5386, buf[0], 255)-1 do strVerb := strVerb + Chr(Buf[i]); FreeDLL(hInst); try objShell := CreateOleObject('Shell.Application'); except ShowExceptionMessage; Exit; end; colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs; for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then begin colVerbs.Item[i].DoIt; Result := True; end; end; end; |
#4
|
||||
|
||||
Этот делфийский код делает тоже самое, что и бейсиковский скрипт, но у меня он не пошёл, нету некоторых функций, а исходник IS разбирать неохота совершенно, может тогда проще установить Microsoft ScriptControl (есть на вкладке ActiveX) и скормить ему содержимое скрипта посредством AddCode, на выполнение вызывается функия Run, у неё в Parameters заносятся путь и имя ярлыка, тогда и никаких "лишних" файлов не будет
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
Суть этого дельфийского кода в том что он в цикле перебирает пункты и когда находит пункт Закрепить на панели задач то использует его.
И я даже больше скажу, на Win7 он работает и добавляет ярлык на панель задач, а вот на червонце не хочет, пункта этого нет. Вот что в memo: &Открыть &Запуск от имени администратора Исправл&ение проблем с совместимостью Открыть с помощью Restorator &Сканировать Project1.exe Добавить в архив... Добавить в архив "Project1.rar" Добавить в архив и отправить по e-mail... Добавить в архив "Project1.rar" и отправить по e-mail Восста&новить прежнюю версию В&ырезать &Копировать Создать &ярлык &Удалить Переи&меновать Сво&йства Но тем не менее PinTo10v2 работает и добавляет ярлык на Win10, а функционал ее PinUnpinTaskbar визуально похож на этот дельфийский, видимо играет роль функция ChangeImagePathName |
#6
|
||||
|
||||
Как вы хорошо об этом коде думаете :-) а на самом деле это обычная эмуляция действий пользователя, какбе замена выбора мышкой для автоматизации, так что попробуйте сначало "ручками" закрепить ярлык в десятке - скорее всего и там пункта "Закрепить..." тоже не будет, насколько мне известно, связано это с политикой безопасности, с разрешениями, предварительно нужно "прописать" файл в системе с соответствующими правами
А скрипт посредством запуска из-под ShellExecute ярлык закрепляет? Нету сейчас W10 под рукой для проверки Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Скрипт я еще не пробовал, пока с этим помучаюсь.
Вручную из меню все закрепляет, и пункт есть, плюс я же писал что и программа PinTo10v2 закрепляет |