Работа с ярлыками
Работа с ярлыками
Работа с ярлыками 1) Как можно программно запустить ярлык? 2) Как программно создать ярлык? 3) Как программным путем задавать координаты ярлыкам на рабочем столе? 4) Как получить информацию о ярлыке? Как можно программно запустить ярлык? uses ShellApi; procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(0, nil, 'C:\xxx.lnk', nil, nil, SW_SHOWNORMAL); end; где xxx.lnk - имя ярлыка. Заметьте, что процедура ShellExecute требует подключения модуля ShellApi, который служит для того, чтобы дать разработчику возможность использовать WinAPI. Процедура ShellExecute очень универсальна, с помощью ее можно не только запускать ярлыки, но и открывать браузер с заданным адресом или почтовый клиент с введенным адресом. Для того чтобы подробнее разобраться с этой процедурой почитайте HELP по API функциям. ************************************************************* Как программно создать ярлык? Первым делом нужно подключить следующие модули: uses ShlObj, ComObj, ActiveX; Следующая процедура создает ярлык: procedure CreateLink(const PathObj, PathLink, Desc, Param: string); var IObject: IUnknown; SLink: IShellLink; PFile: IPersistFile; begin IObject := CreateComObject(CLSID_ShellLink); SLink := IObject as IShellLink; PFile := IObject as IPersistFile; with SLink do begin SetArguments(PChar(Param)); SetDescription(PChar(Desc)); SetPath(PChar(PathObj)); end; PFile.Save(PWChar(WideString(PathLink)), FALSE); end; Пример вызова функции: procedure TForm1.Button1Click(Sender: TObject); begin CreateLink('c:\setup.exe','c:\set.lnk','',''); end; В результате будет создан ярлык set.lnk на приложение setup.exe, которое находится на диске C:. Параметр Desc содержит описание ярлыка, его можно опустить. А параметр Param отвечает за список параметров, которые нужно задать ярлыку, в большинстве случаев его тоже можно опустить. ******************************************************** Как программным путем задавать координаты ярлыкам на рабочем столе? Рабочий стол перекрыт сверху компонентом ListView, на котором и отображаются иконки. Вам просто необходимо взять Handle этого элемента управления, и работать уже непосредственно с ним. function GetDesktopListViewHandle: THandle; var S: String; begin Result := FindWindow('ProgMan', nil); Result := GetWindow(Result, GW_CHILD); SetLength(S, 40); GetClassName(Result, PChar(S), 39); if PChar(S) <> 'SysListView32' then Result := 0; end; После этого вы можете использовать API этого ListView, определенный в модуле CommCtrl, для того, чтобы манипулировать рабочим столом. Не забудьте добавить в uses CommCtrl! ListView_SetItemPosition(GetDesktopListViewHandle,I,x,y); ярлыку с индексом I, задаст координаты (x,y). К примеру Мой компьютер имеет индекс 0, т.е I:=0; ************************************************** Как получить информацию о ярлыке? Следующая процедура извлекает всю необходимую информацию из ярлыка uses ShlObj, ComObj, ActiveX, CommCtrl; type PShellLinkInfoStruct = ^TShellLinkInfoStruct; TShellLinkInfoStruct = record FullPathAndNameOfLinkFile: array[0..MAX_PATH] of Char; FullPathAndNameOfFileToExecute: array[0..MAX_PATH] of Char; ParamStringsOfFileToExecute: array[0..MAX_PATH] of Char; FullPathAndNameOfWorkingDirectroy: array[0..MAX_PATH] of Char; Description: array[0..MAX_PATH] of Char; FullPathAndNameOfFileContiningIcon: array[0..MAX_PATH] of Char; IconIndex: Integer; HotKey: Word; ShowCommand: Integer; FindData: TWIN32FINDDATA; end; procedure GetLinkInfo(lpShellLinkInfoStruct: PShellLinkInfoStruct); var ShellLink: IShellLink; PersistFile: IPersistFile; AnObj: IUnknown; begin // доступ ко второму интерфейсу объекта AnObj := CreateComObject(CLSID_ShellLink); ShellLink := AnObj as IShellLink; PersistFile := AnObj as IPersistFile; // Открываем файл и инициализируем объект по данным файла PersistFile.Load(PWChar(WideString(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile)), 0); with ShellLink do begin // Восстанавливаем путь и имя ярлыка GetPath(lpShellLinkInfoStruct^.FullPathAndNameOfFileToExecute, SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile),lpShellLinkInfoStruct^.FindData,SLGP_UNCPRIORITY); // Восстанавливаем описание ярлыка GetDescription(lpShellLinkInfoStruct^.Description, SizeOf(lpShellLinkInfoStruct^.Description)); // Восстанавливаем строку параметров связанную с ярлыком GetArguments(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute, SizeOf(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute)); // Восстанавливаем путь рабочей дириктории ярлыка GetWorkingDirectory(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy, SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy)); // Восстанавливаем путь к иконке ярлыка GetIconLocation(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon, SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon), lpShellLinkInfoStruct^.IconIndex); // Восстанавливаем горячие клавиши связанные с ярлыком GetHotKey(lpShellLinkInfoStruct^.HotKey); // Восстанавливаем показ (SW_) команды ярлыка GetShowCmd(lpShellLinkInfoStruct^.ShowCommand); end; Следующая процедура прочитает данные из ярлыка C:WINNTProfilesuserDesktopFileName.lnk и запишет их в переменную S, после чего выведет всю информацию в Memo1. procedure TForm1.Button1Click(Sender: TObject); const br = #13#10; var LinkInfo: TShellLinkInfoStruct; s: string; begin FillChar(LinkInfo, SizeOf(LinkInfo), #0); LinkInfo.FullPathAndNameOfLinkFile := ?C:WINNTProfilesuserDesktopFileName.lnk?; GetLinkInfo(@LinkInfo); with LinkInfo do s := FullPathAndNameOfLinkFile + br + FullPathAndNameOfFileToExecute + br + ParamStringsOfFileToExecute + br + FullPathAndNameOfWorkingDirectroy + br + Description + br + FullPathAndNameOfFileContiningIcon + br + IntToStr(IconIndex) + br + IntToStr(LoByte(HotKey)) + br + IntToStr(HiByte(HotKey)) + br + IntToStr(ShowCommand) + br + FindData.cFileName + br + FindData.cAlternateFileName; Memo1.Lines.Add(s); end;