Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.09.2017, 14:02
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию Закрепление ярлыка на панели задач

Как программно добавить ярлык на панель задач, так как это делает встроенная функция "Закрепить на панели задач"?
Создать ярлык в папке C:\Users\<Пользователь>\AppData\Roaming\Microsoft\ Internet Explorer\Quick Launch\User Pinned\TaskBar
недостаточно, ярлык в папке появляется а на панели нет, видимо нужно еще какое то действие.
Подскажите кто знает.
Ответить с цитированием
  #2  
Старый 27.09.2017, 16:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Shaft
...видимо нужно еще какое то действие...
Да ещё видимо в реестре на ветке HKEY_CURRENT_USER\Software\Microsof t\Windows\CurrentVersion\Explorer\Taskband нужно отметить изменения и пути до ярлыка

А самое обидное, это вот
Цитата:
Сообщение от Реймонд Чен
The Resourcefulness of Annoying People
Сейчас Windows не так открыта, как была когда-то. В ранние, простые дни Windows была спроектирована в более доверительной манере. Были документированы внутренние форматы данных, а программы могли влиять на систему самым широким образом. Предполагалось, что разработчики программ будут использовать эту силу со всей ответственностью и для блага пользователя. В конце концов, если программа злоупотребляла доверием пользователя, то, как тогда считалось, компания бы быстро потеряла всех своих клиентов. У разработчиков, следовательно, был стимул относиться к пользоватю с уважением. Тогда было тогда.
...

...Есть и другие примеры вещей, для которых Microsoft не стала делать программное управление из опасений, что эта сила будет использована во зло. Например, нет никакого интерфейса для работы с иконками Панели задач от другой программы, или для добавления или удаления панели (band) в Панели задач. Представьте себе хаос, который мог бы возникнуть, если мы бы позволили совершенно любой программе манипулировать этими высокочувствительными компонентами пользовательского интерфейса...


З.Ы. Нашёл вариант закрепления через скрипт.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;
повторный запуск ярлык открепляет, проверил, работает
Вложения
Тип файла: zip 4.zip (436 байт, 9 просмотров)

Последний раз редактировалось Alegun, 27.09.2017 в 20:19.
Ответить с цитированием
  #3  
Старый 28.09.2017, 11:28
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Через ShellExecute у меня есть PinTo10v2, тоже работает. Но хочется все одним файлом. У меня есть исходник PinTo10v2 но она на C#
Вот как она это делает:

Код:
if (taskbar)
{ 
  Utils.ChangeImagePathName("explorer.exe");
  success = Utils.PinUnpinTaskbar(fileName, pin);
  if (success) Utils.RestoreImagePathName();
}
код PinUnpinTaskbar
Код:
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;
        }
Код ChangeImagePathName
Код:
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;
Но чет не пашет, почему то в colVerbs.Item[i].Name нет "Закрепить на панели задач", выводил в memo, все есть а этого нет, видимо ChangeImagePathName играет значительную роль, но я не знаю C# поэтому даже не могу определить что она делает
Ответить с цитированием
  #4  
Старый 28.09.2017, 14:10
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Этот делфийский код делает тоже самое, что и бейсиковский скрипт, но у меня он не пошёл, нету некоторых функций, а исходник IS разбирать неохота совершенно, может тогда проще установить Microsoft ScriptControl (есть на вкладке ActiveX) и скормить ему содержимое скрипта посредством AddCode, на выполнение вызывается функия Run, у неё в Parameters заносятся путь и имя ярлыка, тогда и никаких "лишних" файлов не будет
Ответить с цитированием
  #5  
Старый 28.09.2017, 15:35
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Суть этого дельфийского кода в том что он в цикле перебирает пункты и когда находит пункт Закрепить на панели задач то использует его.
И я даже больше скажу, на Win7 он работает и добавляет ярлык на панель задач, а вот на червонце не хочет, пункта этого нет.
Вот что в memo:
&Открыть
&Запуск от имени администратора
Исправл&ение проблем с совместимостью
Открыть с помощью Restorator
&Сканировать Project1.exe
Добавить в архив...
Добавить в архив "Project1.rar"
Добавить в архив и отправить по e-mail...
Добавить в архив "Project1.rar" и отправить по e-mail
Восста&новить прежнюю версию

В&ырезать
&Копировать
Создать &ярлык
&Удалить
Переи&меновать
Сво&йства

Но тем не менее PinTo10v2 работает и добавляет ярлык на Win10, а функционал ее PinUnpinTaskbar визуально похож на этот дельфийский, видимо играет роль функция ChangeImagePathName
Ответить с цитированием
  #6  
Старый 28.09.2017, 16:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как вы хорошо об этом коде думаете :-) а на самом деле это обычная эмуляция действий пользователя, какбе замена выбора мышкой для автоматизации, так что попробуйте сначало "ручками" закрепить ярлык в десятке - скорее всего и там пункта "Закрепить..." тоже не будет, насколько мне известно, связано это с политикой безопасности, с разрешениями, предварительно нужно "прописать" файл в системе с соответствующими правами

А скрипт посредством запуска из-под ShellExecute ярлык закрепляет? Нету сейчас W10 под рукой для проверки
Ответить с цитированием
  #7  
Старый 28.09.2017, 16:50
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Скрипт я еще не пробовал, пока с этим помучаюсь.
Вручную из меню все закрепляет, и пункт есть, плюс я же писал что и программа PinTo10v2 закрепляет
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter