Windows .lnk (바로 가기) 파일에서 아이콘을 추출합니다
문제
Windows 바로 가기 (.lnk) 파일에서 아이콘을 추출해야합니다 (또는 단축키가 지적한 경우 아이콘 파일을 찾으십시오).
Exe 's, DLL 등에서 아이콘을 추출하는 것에 대해 묻는 것이 아닙니다. 설치 프로그램을 실행할 때 해당 단축키가 생성됩니다. 단축키에 의해 표시되는 아이콘은 단축키가 가리키는 .exe에 포함되어 있지 않습니다. 아마도 아이콘은 .lnk 파일에 내장되어 있거나 .lnk 파일에는이 아이콘이있는 위치에 대한 포인터가 포함되어 있습니다. 그러나 내가 찾은 유틸리티 중 어느 것도 이것을 다루지 않습니다. 그들은 모두 .exe로갑니다.
많은 감사합니다!
해결책
이 스레드는 다음에 대한 흥미로운 정보를 제공합니다 .lnk 파일에 포함 된 데이터
그만큼 sshgetfileinfoss 함수는 아이콘 파일을 추출 할 수 있어야합니다.
문서화 여기, 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);
유틸리티를 구축 할 수도 있습니다 자동화 스크립트 언어, 당신이 다음과 같이 선언 된 해당 함수를 사용하는 곳.
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
다른 팁
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();
이에 몇 가지 더 많은 리소스를 추가하려면 왼쪽 하단 모서리에 바로 가기가있는 응용 프로그램의 아이콘이 아니기 때문에 다음과 같습니다.
나는 이것을 사용하여 아이콘을 얻습니다 없이 바로 가기 화살표 미니 아이콘이 이미지로 추가되었습니다.
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);