2008-12-05 5 views
6

Мне нужно извлечь значок из файла ярлыка Windows (.lnk) (или найти файл значка, если на него просто указал ярлык).Извлечь иконку из Windows .lnk (shortcut) file

Я не спрашиваю об извлечении значков из exe's, dll и т. Д. Ярлык, о котором идет речь, создается при запуске программы установки. И значок, отображаемый ярлыком, не содержится в .exe, на который указывает ярлык. Предположительно, значок встроен в файл .lnk или файл .lnk содержит указатель на то, где находится этот значок. Но ни одна из утилит, которые я нашел, не обращается к этому - все они просто идут в .exe.

Большое спасибо!

ответ

5

Эта нить обеспечивает интересную информацию о data contained in a .lnk file

sSHGetFileInfoss функция должна быть в состоянии извлечь файл значок.

Документально here, и используется для LNK файла:

Path2Link := 'C:\Stuff\TBear S Saver.lnk'; 
SHGetFileInfo(PChar(Path2Link), 0, ShInfo1, SizeOf(TSHFILEINFO), 
      SHGFI_ICON); 
// this ShInfo1.hIcon will have the Icon Handle for the Link Icon with 
// the small ShortCut arrow added} 

Из первой ссылке, вы могли бы построить такую ​​утилиту в C#, где вы бы объявить эту функцию, как:

[DllImport("shell32.dll")] 
public static extern IntPtr SHGetFileInfo(
    string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, 
    uint cbSizeFileInfo, uint uFlags); 

Вы также можете построить утилиту в autoit script language, где вы использовали бы эту функцию, объявленную следующим образом:

Func _ShellGetAssocIcon(Const $szFile,Const $IconFlags = 0) 
    Local $tFileInfo = DllStructCreate($tagSHFILEINFO) 
    If @error Then 
     Return SetError(1,@extended,0) 
    EndIf 

    Local $Ret = DllCall("shell32.dll","int","SHGetFileInfo","str",$szFile,"dword",0, _ 
     "ptr",DllStructGetPtr($tFileInfo),"uint",DllStructGetSize($tFileInfo),"uint",BitOr($SHGFI_ICON,$IconFlags)) 
    MsgBox(0,0,@error) 
    Return DllStructGetData($tFileInfo,"hIcon") 
EndFunc 
+1

Возможно, дайте ему немного больше информации, например, формат struct etc. Но ты получил мой голос. – 2008-12-05 09:33:35

1

Вы также можете самостоятельно проанализировать файл .lnk, см. this pdf или this article о подробностях формата файла ярлыков.

Или вы можете использовать класс ShellLink, упомянутый в ответе на this question.

+0

обе ссылки мертвы. :/ – saint1729 2013-11-22 17:13:45

+0

Ссылка .PDF заархивирована здесь: http://web.archive.org/web/20090408051551/http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf, и статья заархивирована здесь: http://web.archive.org/web/20110817051855/http://www.stdlib.com/art6-Shortcut-File-Format-lnk.html – 2015-05-20 02:20:17

1

В 2010 году Microsoft наконец выпустила официальный формат формата LNK. Разумеется, он гораздо точнее и детализирован, чем спецификации с обратной обработкой, плавающие вокруг сети.

Для полноты использования here - это описание ссылок и ярлыков в MSDN.

5

Используя метод Shell32 из acessing ссылок:

String lnkPath = @"C:\Users\PriceR\Desktop\Microsoft Word 2010.lnk"; 
//--- run microsoft word 
var shl = new Shell32.Shell();   // Move this to class scope 
lnkPath = System.IO.Path.GetFullPath(lnkPath); 
var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath)); 
var itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath)); 
var lnk = (Shell32.ShellLinkObject)itm.GetLink; 
//lnk.GetIconLocation(out strIcon); 
String strIcon; 
lnk.GetIconLocation(out strIcon); 
Icon awIcon = Icon.ExtractAssociatedIcon(strIcon); 
this.button1.Text = ""; 
this.button1.Image = awIcon.ToBitmap(); 
+2

Тяжелое копирование с http://stackoverflow.com/a/2566008/17034 – 2013-01-02 22:06:57

0

Я использую это, чтобы получить значок без ярлык стрелки мини значок добавил над ним, как изображение:

using IWshRuntimeLibrary;

Image ShortcutIcon = System.Drawing.Icon.ExtractAssociatedIcon(((IWshShortcut)new WshShell().CreateShortcut(File)).TargetPath).ToBitmap(); 

Если вы хотите получить вместо него значок:

Icon ShortcutIcon = System.Drawing.Icon.ExtractAssociatedIcon(((IWshShortcut)new WshShell().CreateShortcut(File)).TargetPath); 

 Смежные вопросы

  • Нет связанных вопросов^_^