سؤال

كيف يمكنك إنشاء اختصار تطبيق (ملف .lnk) في C# أو باستخدام إطار عمل .NET؟

ستكون النتيجة ملف .lnk للتطبيق المحدد أو عنوان URL.

هل كانت مفيدة؟

المحلول

وانها ليست بسيطة كما كنت قد أحببت، ولكن هناك مكالمة الطبقة كبيرة <وأ href = "http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/Creating_and_Modifying_Shortcuts/ShellLink_Code. أتش تي أم أل "يختلط =" نوفولو noreferrer "> ShellLink.cs في vbAccelerator

وهذا الرمز يستخدم إمكانية التشغيل المتداخل، ولكن لا تعتمد على WSH.

<ع> استخدام هذه الفئة، ورمز لإنشاء اختصار هو:

private static void configStep_addShortcutToStartupGroup()
{
    using (ShellLink shortcut = new ShellLink())
    {
        shortcut.Target = Application.ExecutablePath;
        shortcut.WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath);
        shortcut.Description = "My Shorcut Name Here";
        shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
        shortcut.Save(STARTUP_SHORTCUT_FILEPATH);
    }
}

نصائح أخرى

جميلة ونظيفة.(نت 4.0)

Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
dynamic shell = Activator.CreateInstance(t);
try{
    var lnk = shell.CreateShortcut("sc.lnk");
    try{
        lnk.TargetPath = @"C:\something";
        lnk.IconLocation = "shell32.dll, 1";
        lnk.Save();
    }finally{
        Marshal.FinalReleaseComObject(lnk);
    }
}finally{
    Marshal.FinalReleaseComObject(shell);
}

هذا كل شيء، لا حاجة إلى رمز إضافي. انشاء اختصار يمكن حتى تحميل الاختصار من الملف، لذلك خصائص مثل مسار الهدف إرجاع المعلومات الموجودة. خصائص كائن الاختصار.

من الممكن أيضًا بهذه الطريقة لإصدارات .NET التي لا تدعم الأنواع الديناميكية.(نت 3.5)

Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); //Windows Script Host Shell Object
object shell = Activator.CreateInstance(t);
try{
    object lnk = t.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, shell, new object[]{"sc.lnk"});
    try{
        t.InvokeMember("TargetPath", BindingFlags.SetProperty, null, lnk, new object[]{@"C:\whatever"});
        t.InvokeMember("IconLocation", BindingFlags.SetProperty, null, lnk, new object[]{"shell32.dll, 5"});
        t.InvokeMember("Save", BindingFlags.InvokeMethod, null, lnk, null);
    }finally{
        Marshal.FinalReleaseComObject(lnk);
    }
}finally{
    Marshal.FinalReleaseComObject(shell);
}

ولقد وجدت شيئا من هذا القبيل:

private void appShortcutToDesktop(string linkName)
{
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

    using (StreamWriter writer = new StreamWriter(deskDir + "\\" + linkName + ".url"))
    {
        string app = System.Reflection.Assembly.GetExecutingAssembly().Location;
        writer.WriteLine("[InternetShortcut]");
        writer.WriteLine("URL=file:///" + app);
        writer.WriteLine("IconIndex=0");
        string icon = app.Replace('\\', '/');
        writer.WriteLine("IconFile=" + icon);
        writer.Flush();
    }
}

ورمز الأصلي في sorrowman في المادة "رابط-link- لسطح المكتب "

وبعد مسح كل الاحتمالات وجدت على SO لقد استقر على ShellLink :

//Create new shortcut
using (var shellShortcut = new ShellShortcut(newShortcutPath)
{
     Path = path
     WorkingDirectory = workingDir,
     Arguments = args,
     IconPath = iconPath,
     IconIndex = iconIndex,
     Description = description,
})
{
    shellShortcut.Save();
}

//Read existing shortcut
using (var shellShortcut = new ShellShortcut(existingShortcut))
{
    path = shellShortcut.Path;
    args = shellShortcut.Arguments;
    workingDir = shellShortcut.WorkingDirectory;
    ...
}

وبصرف النظر عن كونها بسيطة وفعالة، المؤلف (ماتياس سيوغرين، MS MVP) هو نوع من COM / PInvoke / إمكانية التشغيل المتداخل المعلم، ويلاحقونهم متاحة له وأعتقد أنه من أكثر قوة من البدائل.

وتجدر الإشارة إلى أن الملفات الاختصار كما يمكن إنشاء عدة مرافق فلكس (والتي بدورها يمكن الاستناد إليها بسهولة من C # /. NET). لم أحاول أبدا أي منهم، ولكن كنت أبدأ مع NirCmd (وNirsoft ويكون SysInternals- مثل أدوات الجودة).

ومما يؤسف له NirCmd لا يمكن <م> تحليل ملفات الاختصار (خلق لهم فقط)، ولكن لهذا الغرض <لأ href = "https://www.tzworks.net/prototype_page.php؟proto_id=11 "يختلط =" نوفولو "> TZWorks ليرة لبنانية يبدو قادرة. حتى أنه يمكن تهيئة انتاجها كما CSV. LNK-محلل تبدو جيدة جدا (أنه يمكن إخراج كل من HTML و CSV).

وعلى غرار IllidanS4 في الإجابة ، وذلك باستخدام في ويندوز سيناريو المضيف أثبتت أن الحل الأسهل بالنسبة لي (اختبار على ويندوز 8 64 بت).

ولكن، بدلا من استيراد نوع COM يدويا من خلال التعليمات البرمجية، فمن السهل أن مجرد إضافة مكتبة نوع COM كمرجع. اختيار References->Add Reference...، COM->Type Libraries وإيجاد وإضافة <م> "ويندوز سيناريو كائن المضيف الموديل" .

وهذه تستورد IWshRuntimeLibrary مساحة الاسم، التي يمكنك من خلالها الوصول:

WshShell shell = new WshShell();
IWshShortcut link = (IWshShortcut)shell.CreateShortcut(LinkPathName);
link.TargetPath=TargetPathName;
link.Save();

الائتمان يذهب إلى جيم هولنهورست .

أنزل IWshRuntimeLibrary

وتحتاج أيضا إلى استيراد من IWshRuntimeLibrary مكتبة COM. انقر بزر الماوس الأيمن على المشروع الخاص بك -> إضافة إشارة -> COM -> IWshRuntimeLibrary -> إضافة ومن ثم استخدام التعليمات البرمجية المتكررة التالية

private void createShortcutOnDesktop(String executablePath)
{
    // Create a new instance of WshShellClass

    WshShell lib = new WshShellClass();
    // Create the shortcut

    IWshRuntimeLibrary.IWshShortcut MyShortcut;


    // Choose the path for the shortcut
    string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    MyShortcut = (IWshRuntimeLibrary.IWshShortcut)lib.CreateShortcut(@deskDir+"\\AZ.lnk");


    // Where the shortcut should point to

    //MyShortcut.TargetPath = Application.ExecutablePath;
    MyShortcut.TargetPath = @executablePath;


    // Description for the shortcut

    MyShortcut.Description = "Launch AZ Client";

    StreamWriter writer = new StreamWriter(@"D:\AZ\logo.ico");
    Properties.Resources.system.Save(writer.BaseStream);
    writer.Flush();
    writer.Close();
    // Location for the shortcut's icon           

    MyShortcut.IconLocation = @"D:\AZ\logo.ico";


    // Create the shortcut at the given path

    MyShortcut.Save();

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top