在C#中是否有方法通过编程找到快捷目标的当前位置?
Windows快捷方式使用分布式链接跟踪服务获取快捷方式目标的当前位置,该目标在单击链接时已移动或重命名。是否有任何方法可以通过编程方式(在C#)获取此位置?是。您可以从以下位置使用代码:在C#中是否有方法通过编程找到快捷目标的当前位置?,c#,windows,shortcuts,C#,Windows,Shortcuts,Windows快捷方式使用分布式链接跟踪服务获取快捷方式目标的当前位置,该目标在单击链接时已移动或重命名。是否有任何方法可以通过编程方式(在C#)获取此位置?是。您可以从以下位置使用代码: 对。您可以从以下位置使用代码: 对Devil_coder/Cody Gray提供的代码进行一个小的添加就可以满足我的需要。添加link.Resolve,如下所示,带有中定义的标志 使link.Path返回当前链接目标 Shell32.ShellLinkObject link=(Shell32.ShellLin
对。您可以从以下位置使用代码:
对Devil_coder/Cody Gray提供的代码进行一个小的添加就可以满足我的需要。添加link.Resolve,如下所示,带有中定义的标志 使link.Path返回当前链接目标
Shell32.ShellLinkObject link=(Shell32.ShellLinkObject)folderItem.GetLink;
链接。解决(5);
Console.WriteLine(link.Path)代码>对Devil_coder/Cody Gray提供的代码进行了一个小的添加,就可以满足我的需要。添加link.Resolve,如下所示,带有中定义的标志
使link.Path返回当前链接目标
Shell32.ShellLinkObject link=(Shell32.ShellLinkObject)folderItem.GetLink;
链接。解决(5);
Console.WriteLine(link.Path)代码>您的意思是获取启动EXE的位置吗?当您说“在C#”时,是否意味着p/Invoke不可接受?该位置是快捷方式目标的位置-不涉及.EXE。我相信.lnk文件存储了一个唯一的文件标识符,该标识符随后用作链接跟踪服务的参数,如果目标位置发生了更改,链接跟踪服务将更新目标位置,我认为该位置也存储在.lnk文件中。我很乐意使用任何方法获取位置,包括P/Invoke(如果需要的话)。你是说获取启动EXE的位置吗?当你说“在C#”时,这是否意味着P/Invoke不可接受?该位置是快捷方式目标的位置-不涉及.EXE。我相信.lnk文件存储了一个唯一的文件标识符,该标识符随后用作链接跟踪服务的参数,如果目标位置发生了更改,链接跟踪服务将更新目标位置,我认为该位置也存储在.lnk文件中。我很乐意使用任何方法来获取位置,包括P/Invoke(如果需要的话)。很遗憾,这段非常优雅的代码只获取.lnk文件中当前存储的链接目标。如果目标被移动或重命名,返回的路径不会改变。不幸的是,这段非常优雅的代码只获取.lnk文件中当前存储的链接目标。如果移动或重命名目标,则返回的路径不会更改。使用标志值(5=4(更新路径)+1(不显示对话框),选择不删除不存在目标的路径。使用标志值4,将显示说明快捷方式目标已被移动或删除的对话框,并询问是否应删除快捷方式。此对话框不正确,因为将处理移动的目标。使用标志值(5=4(更新路径)+1(不显示对话框),选择不删除不存在目标的路径。使用标志值4,将显示说明快捷方式目标已移动或已删除的对话框,并询问是否应删除快捷方式。此对话框不正确,因为将处理移动的目标。
class Program
{
[STAThread]
static void Main(string[] args)
{
const string shortcut = @"C:\test.lnk"; // Shortcut file name here
string pathOnly = System.IO.Path.GetDirectoryName(shortcut);
string filenameOnly = System.IO.Path.GetFileName(shortcut);
Shell32.Shell shell = new Shell32.Shell();
Folder folder = shell.NameSpace(pathOnly);
FolderItem folderItem = folder.ParseName(filenameOnly);
if (folderItem != null)
{
Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
Console.WriteLine(link.Path);
}
Console.ReadKey();
}
}