我正在尝试从 C# 应用程序启动“开始”菜单中的程序,并且“开始”菜单中的几乎所有项目都是快捷方式 (lnk) 文件。当使用 Process.Start 启动这些文件时,我发现如果 lnk 文件的完整路径指向 C:\Program Files 目录,则会出现“系统找不到指定的路径”错误。我做了一些研究文件系统重定向 http://msdn.microsoft.com/en-us/library/aa365743%28VS.85%29.aspx在 Windows 中,所以我尝试禁用它,但仍然收到相同的错误:
// disable file system redirection:
IntPtr ptr = new IntPtr();
bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr);
// run the file:
System.Diagnostics.Process.Start("c:\\splitter.lnk");
这将返回“系统找不到指定的路径。”但是,如果我从“开始”>“运行”对话框启动 c:\splitter.lnk,则程序运行得很好。您可以在任何 64 位计算机上重现此问题,方法是为任何 64 位应用程序创建快捷方式,将其放置在 C 驱动器上,然后尝试使用上面的代码运行它。
有没有更好的方法来启动 .lnk 文件来避免此问题?或者我没有正确禁用文件重定向?
编辑:我还尝试将 UseShellExecute 设置为 true 以使操作系统运行该文件,但这仍然失败,这很有趣,因为从“开始”>“运行”对话框运行相同的路径效果很好:
Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = "c:\\splitter.lnk";
process.Start();
编辑2:我认为我不会尝试直接启动LNK文件,而是获取它的目标,然后运行该目标。我尝试使用如何在 C# 中解析 .lnk https://stackoverflow.com/questions/139010/how-to-resolve-a-lnk-in-c-sharp and 如何以编程方式跟踪 .lnk 文件 https://stackoverflow.com/questions/8660705/how-to-follow-a-lnk-file-programmatically,但这两种方法都会返回 C:\Program Files (x86)\Splitter.exe 的完整路径,而不是 C:\Program Files\Splitter.exe 的实际路径。
也许我可以使用上述方法之一来获取LNK文件的目标。然后我可以查看目标是否包含程序文件(x86)。如果存在,请将其替换为 Program Files 并检查该文件是否存在。如果它存在于程序文件中,请运行它。如果没有,请从 Program Files (x86) 位置运行该文件。这将是一个混乱的解决方法,但我现在不知道还能尝试什么。任何建议,将不胜感激。