سؤال

أنا بحاجة إلى استخراج الرمز من اختصار windows (.lnk) الملف (أو العثور على رمز الملف, اذا كان فقط أشار إلى طريق الاختصار).

أنا لا أسأل عن استخراج الرموز من اكس, dll, etc.الاختصار في السؤال يتم إنشاؤه عند تشغيل برنامج التثبيت.و يتم عرض الرمز بواسطة الاختصار ليس الواردة في .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}

ومن الحلقة الأولى، هل يمكن بناء مثل هذه المرافق في ج #، حيث ستعلن هذه الوظيفة مثل:

[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 من الوصول إلى الروابط التالية:

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

في 2010 أطلقت مايكروسوفت أخيرا href="http://msdn.microsoft.com/en-us/library/dd871305.aspx" مواصفات ملف LNK شكل. ومن أكثر دقة وتفصيلا من المواصفات عكسية العائمة في جميع أنحاء الشبكة، بطبيعة الحال.

لأجل اكتمال، هنا هو وصف MSDN من الروابط قذيفة والاختصارات.

ويمكنك أيضا تحليل .lnk ملف نفسك، انظر هذه الشعبي أو هذه المقالة على تفاصيل تنسيق ملف الاختصار.

وأو يمكنك استخدام فئة ShellLink المذكورة في الجواب على <لأ href = "https://stackoverflow.com/questions/234231/how-do-you-create-an-application-shortcut-lnk-file- في ج-أو-شبكة # 234543 "> هذا السؤال .

لإضافة عدد قليل من المزيد من الموارد إلى هذا ، لأن presumeably كنت wan't رمز التطبيق و لا رمز له اختصار في أسفل الزاوية اليسرى:

يمكنني استخدام هذا للحصول على رمز دون اختصار السهم مصغرة أيقونة إضافة على أنها صورة:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top