Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление пути ярлыка на рабочем столе без изменения иконки в Pascal

Delphi , Интернет и Сети , Браузер

Пользователи часто сталкиваются с ситуацией, когда изменение пути ярлыка приводит к изменению его иконки. Это может быть нежелательным поведением, особенно если хочется сохранить исходную иконку ярлыка. В данной статье мы рассмотрим, как можно изменить путь ярлыка, не затрагивая его иконку, на примере использования языка Object Pascal в среде разработки Delphi.

Описание проблемы

Когда пользователь изменяет путь в ярлыке, операционная система автоматически обновляет иконку ярлыка, чтобы она соответствовала иконке целевого приложения. Это стандартное поведение, но иногда оно может быть неприемлемо.

Пример кода

Ниже представлен пример кода, который демонстрирует изменение пути ярлыка без изменения его иконки. Код использует компоненты ActiveX и ComObj для работы с интерфейсами ShellLink и IPersistFile.

uses
  ActiveX,
  ComObj,
  ShlObj;

function GetDesktopFolder(Wnd: HWND = 0): string;
var
  buf: array[0..MAX_PATH] of Char;
begin
  if Wnd = 0 then Wnd := Application.Handle;
  if Succeeded(SHGetFolderPath(Wnd, CSIDL_DESKTOP, 0, SHGFP_TYPE_CURRENT, buf)) then
    Result := IncludeTrailingPathDelimiter(buf)
  else
    Result := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MySLink: IShellLink;
  MyPFile: IPersistFile;
  sLnkPath, sExePath, sParams: string;
  szIconPath: array[0..MAX_PATH] of Char;
  iIconIndex: Integer;
  bHasIcon: Boolean;
begin
  sParams := '';
  sExePath := 'C:\Program Files\Google\Chrome\Application\chrome.exe';
  sLnkPath := GetDesktopFolder(Handle) + 'Target.lnk';

  MySLink := CreateComObject(CLSID_ShellLink) as IShellLink;
  MyPFile := MySLink as IPersistFile;

  // Загрузка существующего ярлыка для сохранения его иконки
  if Succeeded(MyPFile.Load(PChar(sLnkPath), STGM_READ)) then
  begin
    MySLink.Resolve(Handle, 0);
    bHasIcon := Succeeded(MySLink.GetIconLocation(szIconPath, Length(szIconPath), @iIconIndex));
  end;

  with MySLink do
  begin
    SetDescription(PChar(''));
    SetPath(PChar(sExePath));
    SetArguments(PChar(sParams));
    SetWorkingDirectory(PChar(ExtractFilePath(sExePath)));
    // Восстановление иконки, если она была сохранена
    if bHasIcon then
      SetIconLocation(szIconPath, iIconIndex)
    else
      SetIconLocation(PChar(''), 0);
  end;

  MyPFile.Save(PChar(sLnkPath), False);
  SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, PChar(sLnkPath), nil);
end;

Подтвержденный ответ

Чтобы изменить путь ярлыка без обновления его иконки, необходимо сохранить текущую информацию об иконке перед изменением пути и восстановить её после. Это можно сделать, используя метод GetIconLocation интерфейса IShellLink для получения информации об иконке, а затем метод SetIconLocation для её восстановления.

Альтернативный ответ

Изменение пути рабочей директории ярлыка так, чтобы это не отображалось в свойствах ярлыка, не представляется возможным. Сведения о целевом приложении, включая путь и рабочую директорию, являются частью метаданных ярлыка и отображаются в его свойствах.

Заключение

Изменение пути ярлыка без изменения его иконки возможно, если перед изменением пути сохранить информацию об иконке и восстановить её после. Это стандартная процедура, доступная в Object Pascal и применяемая в среде разработки Delphi. Пользователи должны быть осведомлены о том, что некоторые аспекты ярлыка, такие как путь и рабочая директория, всегда будут отображаться в его свойствах.

Создано по материалам из источника по ссылке.

Статья о том, как изменить путь ярлыка на рабочем столе в Pascal, не изменяя его иконку.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:49:11/0.0020802021026611/0