从Windows.lnk(快捷方式)文件中提取图标

从Windows.lnk(快捷方式)文件中提取图标,windows,icons,shortcut,Windows,Icons,Shortcut,我需要从windows快捷方式(.lnk)文件中提取图标(或者查找图标文件,如果它只是快捷方式指向的) 我不是在问从exe、dll等中提取图标的问题。有问题的快捷方式是在我运行安装程序时创建的。快捷方式显示的图标不包含在快捷方式指向的.exe中。可能该图标嵌入在.lnk文件中,或者.lnk文件包含指向该图标所在位置的指针。但我发现的所有实用程序都不能解决这个问题——它们都只是转到.exe 非常感谢 此线程提供有关 该函数应该能够提取图标文件 记录并用于lnk文件: Path2Link := 'C

我需要从windows快捷方式(.lnk)文件中提取图标(或者查找图标文件,如果它只是快捷方式指向的)

我不是在问从exe、dll等中提取图标的问题。有问题的快捷方式是在我运行安装程序时创建的。快捷方式显示的图标不包含在快捷方式指向的.exe中。可能该图标嵌入在.lnk文件中,或者.lnk文件包含指向该图标所在位置的指针。但我发现的所有实用程序都不能解决这个问题——它们都只是转到.exe


非常感谢

此线程提供有关

该函数应该能够提取图标文件

记录并用于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#中构建这样一个实用程序,在c#中声明此函数,如下所示:

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

您还可以在中构建一个实用程序,在其中使用声明如下的函数:

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

您也可以自己解析.lnk文件,请参阅或了解快捷方式文件格式的详细信息


或者,您也可以使用回答中提到的ShellLink类为其添加更多资源,因为您可能不希望看到应用程序的图标,而不是在左下角有快捷方式的图标:


2010年,微软终于发布了LNK文件格式的官方版本。当然,它比网络上的反向工程规格更精确、更详细


为完整起见,以下是shell链接和快捷方式的MSDN说明。

使用Shell32访问链接的方法:

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();

我使用它来获取图标,而不在其上方添加快捷箭头小图标作为图像:

使用iwruntimelibrary

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);

也许给他多一点信息,比如结构等格式。但你得到了我的选票。两个链接都是死链接/PDF链接存档在此处:,文章存档在此处:是的,它对我有效,只需要添加对COM对象
Windows脚本主机对象模型的引用。
。如果可以,还值得使用快捷方式对象的
IconLocation
属性。