![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 закрепляет |