سؤال

هل هناك أي طريقة لفتح اختصار Windows (ملف .lnk) وتغيير هدفه؟ لقد وجدت المقتطف التالي الذي يسمح لي بالعثور على الهدف الحالي ، لكنه خاصية للقراءة فقط:

Shell32::Shell^ shl = gcnew Shell32::Shell();
String^ shortcutPos = "C:\\some\\path\\to\\my\\link.lnk";
String^ lnkPath = System::IO::Path::GetFullPath(shortcutPos);
Shell32::Folder^ dir = shl->NameSpace(System::IO::Path::GetDirectoryName(lnkPath));
Shell32::FolderItem^ itm = dir->Items()->Item(System::IO::Path::GetFileName(lnkPath));
Shell32::ShellLinkObject^ lnk = (Shell32::ShellLinkObject^)itm->GetLink;
String^ target = lnk->Target->Path;

لا يمكنني العثور على أي شيء لتغيير الهدف. هل خياري الوحيد لإنشاء اختصار جديد للكتابة فوقها الحالي؟ .. وإذا كان الأمر كذلك ، كيف أفعل ذلك؟

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

المحلول

إنه ليس للقراءة فقط ، استخدم المسار LNK-> بدلاً من ذلك ، يليه LNK-> حفظ (). على افتراض أن لديك امتيازات الكتابة للملف. رمز C# الذي يفعل نفس الشيء في إجابتي في هذا الموضوع.

نصائح أخرى

إعادة إنشاء اختصار مع WSH

يمكنك إزالة اختصار موجود وإنشاء هدف جديد به الهدف الجديد. لإنشاء واحدة جديدة ، يمكنك استخدام المقتطف التالي:

public void CreateLink(string shortcutFullPath, string target)
{
    WshShell wshShell = new WshShell();
    IWshRuntimeLibrary.IWshShortcut newShortcut = (IWshRuntimeLibrary.IWshShortcut)wshShell.CreateShortcut(shortcutFullPath);
    newShortcut.TargetPath = target;
    newShortcut.Save();
}

في الوقت الحالي ، لا أرى أي طريقة لتغيير الهدف دون إعادة إنشاء الاختصار.

ملاحظة: لاستخدام المقتطف ، يجب عليك إضافة نموذج كائن مضيف Windows Script كوم إلى مراجع المشروع.

تغيير المسار المستهدف مع shell32

إليك المقتطف الذي يغير هدف الاختصار دون إزالته وإعادة إنشائه:

public void ChangeLinkTarget(string shortcutFullPath, string newTarget)
{
    // Load the shortcut.
    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder folder = shell.NameSpace(Path.GetDirectoryName(shortcutFullPath));
    Shell32.FolderItem folderItem = folder.Items().Item(Path.GetFileName(shortcutFullPath));
    Shell32.ShellLinkObject currentLink = (Shell32.ShellLinkObject)folderItem.GetLink;

    // Assign the new path here. This value is not read-only.
    currentLink.Path = newTarget;

    // Save the link to commit the changes.
    currentLink.Save();
}

والثاني هو ما تحتاجه.

ملاحظة: آسف ، فإن المقتطفات في C# لأنني لا أعرف C ++/CLI. إذا أراد شخص ما إعادة كتابة هذه المقتطفات لـ C ++/CLI ، فلا تتردد في تحرير إجابتي.

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