【问题标题】:How to get the (.lnk) shortcut filepath in a program which started by the shortcut?如何在由快捷方式启动的程序中获取(.lnk)快捷方式文件路径?
【发布时间】:2011-12-25 02:03:23
【问题描述】:

我有一个打开 *.postfix 文件的 c# 程序。

如果用户运行指向我的文件类型的 (.lnk) 快捷方式,我的程序将打开目标。

那么,我的程序怎么知道它是由 (.lnk) 快捷方式启动的(并获取它的文件路径)?

在某些情况下,我需要替换 .lnk 文件。

谢谢!

已编辑 首先,感谢回答我问题的人。

按照@Anders 的回答,我发现我的问题出在这里。

我对windows注册表做了一些修改,所以浏览器知道把自定义的协议字符串扔给某个程序。

类似的东西..

[互联网快捷方式] URL=myProtocol://abcdefg.....

这也许就是我丢失 lpTitle 的原因。 :(

我将尝试这种方式: 每当我的程序被调用时,当然是 %1,程序检查当前打开的资源管理器(窗口),并尝试使用 IWebBrowserApp 获取它的当前路径。当然,使用该路径和桌面,扫描并分析 *.lnk 以确定要替换哪个。

我认为这可能会奏效,但不确定。我会尝试。 继续

【问题讨论】:

  • 我不确定这是否可行。 .LNK 文件由资源管理器打开,该信息用于生成进程(例如 CreateProcess)。我不知道是否/如何提供如何进程(或是否涉及 LNK 文件)的信息...
  • 将此重新标记为 winapi - 希望这方面的一些专家可以提供更彻底的答案。

标签: c# windows winapi


【解决方案1】:

在本机代码中,您可以调用GetStartupInfo,如果STARTF_TITLEISLINKNAME 位在STARTUPINFO.dwFlags 中设置,则.lnk 的路径在STARTUPINFO.lpTitle 中。我不知道是否有 .NET 方式来获取此信息,您可能必须 P/Invoke...

【讨论】:

  • 这让我更进一步。到目前为止,我的输出中没有包含 .lnk 文件路径。我应该多尝试一下,无论如何,谢谢。
  • 我的快捷方式内容是[InternetShortcut] URL=myProtocol://......我认为这会导致问题,lpTitle可能已经被资源管理器消耗了?也许不是。仍在尝试.. 感谢您的谷歌catch22.net/tuts/undoc01
  • .LNK 使用 IShellLink 接口,您在谈论 IUniformResourceLocator,我不确定 shell 是否会以相同的方式将路径传递给您...
【解决方案2】:

你没有。没有办法做到这一点。故事结束。

因此,由于最近的反对票,这引起了我的注意。有一个公认的答案显示了一个想法,该想法在大多数情况下都可以获得启动快捷方式的路径。但是我的回答是针对整体的。 OP 想要快捷方式的链接,以便他可以更改它。这是大多数时候做不到的。

最有可能的情况是快捷方式文件存在于开始菜单中但不可写。然而,其他情况涉及来自另一个启动应用程序的快捷方式,该应用程序甚至没有从磁盘读取它,而是从数据库中读取(我见过很多公司级受限的应用程序启动工具)。我还有一个程序,它不是通过IShellLink 而是通过解析.lnk 文件(因为它不能出于某种原因启动COM)并启动包含的程序来从快捷方式启动程序。它没有传递STARTF_TITLEISLINKNAME,因为它传递了一个实际的标题。

【讨论】:

  • 仅当它在用户激活快捷方式之前运行,并准备好答案在磁盘以外的地方。
  • 我已经在终端上运行了一项服务。我需要知道有多少种方法可以做到这一点。 Hook 必须是最后一个选项,我不熟悉 hook(尤其是这样做)。任何人都可以在这里留下链接或适当的搜索关键字? THK。
  • @Joshua 为什么你会回答“没有办法做到这一点。故事结束。”?你怎么能这么肯定?你有没有做过任何研究?第二个我看到问题标题我知道答案所以我假设一些谷歌搜索也会找到答案......
  • 用户不希望程序修改他们的快捷方式。如果我用选项 X 创建了 Z 的快捷方式,那么我希望它仍然是使用选项 X 的 Z 的快捷方式,而不是在我背后偷偷地更改为其他东西。
  • @Anders:您的解决方案并非在所有情况下都有效。隐藏假设:启动程序是 explorer 或使用 ShellExec 打开 .lnk 文件。推论:.lnk 位于磁盘上。 Raymond 不久前曾在博客中提到可以将链接内容存储在数据库中,但我的 google-fu 目前还不够强大,无法找到它。
【解决方案3】:

如果您使用 Visual Studio 安装项目来构建安装程序并进行文件类型关联,则应遵循这些说明http://www.dreamincode.net/forums/topic/58005-file-associations-in-visual-studio/

  1. 在 Visual Studio 中打开您的解决方案。

  2. 通过文件向解决方案添加安装项目、添加项目、新建项目、安装和部署项目、安装项目

  3. 在“解决方案资源管理器”窗口中右键单击您的安装项目,选择视图,然后选择文件类型。

    您将在 Visual Studio 中看到“文件类型”窗口。窗口顶部将显示“目标计算机上的文件类型”

  4. 右键单击“目标机器上的文件类型”。菜单将弹出添加“文件类型”单击此选项。

    您将看到添加了“新文档类型#1”,并在其下方看到了“&open”。

  5. “新文档类型#1”可以是您想要的任何东西 - 将其更改为描述性内容。虽然用户从未见过,但永远不要使用常见的东西 - 尽可能独特,因为您甚至可以覆盖当前文件关联意识到这一点。例如,您可能认为“pngfile”可能是一个有用的名称 - 但现在使用它会将所有“*.png”文件发送到您的应用程序,而不是图像查看器。一个好的做法可能是“YourCompantName.Filetype” ",其中您的公司名称是您的公司名称,而“文件类型”是文件的描述性文本。

  6. 在新类型的“属性”窗口中,您需要更改一些属性: 命令:更改为您要运行的应用程序。如果单击“...”,您会很想找到并使用“主要输出...”文件 描述:这是文件类型的描述(如果它没有描述它的自我) 扩展:这是您选择的程序的扩展列表。用“,”分隔每个 图标:这会将图标与您的文件类型相关联,这会显示在窗口资源管理器中。

  7. 现在我们转到“&open”。如果您右键单击文件,这是一个可用的操作。默认操作(“&Open”当前设置为默认值)是当您双击文件时发生的。右键单击“新文档类型#1”以添加操作,但目前,让我们定义我们的“&open”操作

    单击“&Open”。您将在属性窗口中看到“名称”、“参数”、“动词”。动词对用户隐藏,但它是存储在注册表中的键。保留它与名称相同,但没有“&”。“参数”的默认值为“%1”,这意味着传递完整您的应用程序的路径和文件名。您也可以在此处添加其他内容,如果您需要将标志传递给您的应用程序以执行特殊操作。所有这些信息都在命令行上传递给您的应用程序,因此您需要熟悉“Environment.CommandLine”对象。

    如果您需要将不同的动作设置为默认值,只需右键单击该动作并“设置为默认值”

基本上,您会将文件路径作为参数传递给您的程序。然后,如果它是控制台应用程序或 Windows 窗体,则应检查 Program.Main 中的参数

static void Main(string[] args) { //if file association done with Arguments %1 as per forum post above //you file path should be in args[0] string filePath = null; if(args != null && args.Length > 0) filePath = args[0]; }

对于 WPF 应用程序,您需要在应用程序的 StartUp 事件中处理它

void App_Startup(object sender, StartupEventArgs e) { string filePath = null; if ((e.Args != null) && (e.Args.Length > 0)) { filePath = e.Args[0]; } }

【讨论】:

  • Emmanuel,这是一篇非常有用且写得很好的帖子,但不幸的是,这根本不是原始发帖人想要的。他们想知道我是否为程序创建了一个新的快捷方式,然后单击该快捷方式,包含该快捷方式的 .lnk 文件的名称是什么。
猜你喜欢
  • 2013-08-04
  • 2012-05-07
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多