我需要从Windows快捷方式(.lnk)文件中提取图标(或者找到图标文件,如果它只是快捷方式指向的那样)。
我不是要求从exe,dll等中提取图标。当我运行安装程序时,会创建有问题的快捷方式。并且快捷方式显示的图标不包含在快捷方式指向的.exe中。据推测,该图标嵌入在.lnk文件中,或者.lnk文件包含指向此图标所在位置的指针。但是我找到的所有工具都没有解决这个问题 - 他们都只是去了.exe。
非常感谢!
答案 0 :(得分:6)
此主题提供有关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 :(得分:6)
使用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();
答案 2 :(得分:2)
2010年,微软最终发布了LNK文件格式的官方specification。当然,它比在网上漂浮的反向工程规范更加准确和详细。
为了完整起见,here是shell链接和快捷方式的MSDN描述。
答案 3 :(得分:1)
您也可以自行解析.lnk文件,有关快捷方式文件格式的详细信息,请参阅this pdf或this article。
或者您可以使用this question的答案中提到的ShellLink类。
答案 4 :(得分:0)
要为此添加更多资源,因为假设您不是应用程序的图标而不是左下角有快捷方式的图标:
答案 5 :(得分: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);