Ууу как сурово... Это Вас кто то из однокласников отпускать не хочет...
(шутка)
Ладно, мой косяк. Не въехал сразу в суть вопроса...
Ну да, и Вы же не признались сразу что ярлычок то не "ручками" положен а образовался в результате операции "Закрепить программу в панели задач" выполненную системой через объект Shell. так ведь?
Короче... исправляюсь.
По сути Вашего вопроса необходимо
1. Обратиться к объекту Shell
2. Получить у него "руль" на управление программы.
3. Выполнить с прогой действие соответствующее операции "Закрепить программу в панели задач" (ну или соответственно "Открепить..." )
Тут есть мелкие проблемки которые надо решить. С них и начнем.
Во первых операция в разных виндо-билдо-версиях может называться "Закрепить программу в панели задач" либо "Закрепить на панели задач". Я уже не говорю про другие языки интерфейса.
Поэтому нам для начала надо узнать правильный заголовок нужной операции.
Для этого мы обратимся к библиотеке "Shell32.dll" и спросим через функцию LoadString.
Так. теперь что именно будем спрашивать.
Есть константы не объявленные в модуле Windows
Код:
{ 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;
}
Есть и другие естественно, но нас интересуют как Вы догадались 5386 и 5387
Вот. наваял функцию которая сделает то что нам нужно. пользуйтесь
Код:
function GetWinResStr(resID: UINT): WideString;
var
h: HMODULE;
buf: array[0..512] of Byte;
sys32dll: string;
len: Integer;
begin
Result := '';
// получаем полный путь к библиотеке Shell32.dll
ZeroMemory(@buf[0],512);
len := GetSystemDirectoryA(PAnsiChar(@buf[0]),256);
if (len = 0) then Exit;
sys32dll := IncludeTrailingPathDelimiter(StrPas(PAnsiChar(@buf[0]))) + 'Shell32.dll';
// подгружаем библиотеку
h := SafeLoadLibrary(sys32dll);
if (h = 0) then Exit;
try
// читаем из библиотеки строку соответствующую ID ресурса
ZeroMemory(@buf[0],512);
len := LoadStringW(h,resID,PWideChar(@buf[0]),512);
if (len > 0) then begin
Result := PWideChar(@buf[0]);
SetLength(Result,len);
end;
finally
FreeLibrary(h);
end;
end;
Ну вот, заголовок получили, теперь можем непосредственно закреплять/откреплять программы и ярлыки.
Функция у меня получилась вот такая
Код:
function AppyShellAppAction(appPath, appExeName: WideString; shellAction: WideString): Boolean;
var
vShell, vFolder, vFolderItem, vItemVerbs : Variant;
vPath, vApp, vAction: Variant;
vi, vItemName: Variant;
i,n: Integer;
s: string;
begin
Result := False;
s := appPath + appExeName;
if not FileExists(s) then Exit;
vPath := appPath;
vAction := shellAction;
vApp := appExeName;
try
try
vShell := CreateOleObject('Shell.Application');
vFolder := vShell.NameSpace(vPath);
vFolderItem := vFolder.ParseName(vApp);
vItemVerbs := vFolderItem.Verbs;
n := vItemVerbs.Count;
for i := 1 to n do
begin
vi := i;
vItemName := vItemVerbs.Item(vi).Name;
if (vItemName = vAction) then begin
vItemVerbs.Item(vi).DoIt;
Result := True;
Break;
end;
end;
except
Result := False;
end;
finally
vShell := Unassigned;
vFolder := Unassigned;
vFolderItem := Unassigned;
vItemVerbs := Unassigned;
end;
end;
Собственно вот и всё
Работающий пример (с исходниками) в аттаче.
Что за зверь такой этот Shell рекомендую почитать тут
Ссылка скрыта от гостей
Вопросы в студию...