如何获取由快捷方式启动的程序中的(.lnk)快捷方式文件路径?

时间:2011-12-25 02:03:24

标签: c# windows winapi

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

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

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

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

谢谢!

被修改的 首先,感谢那些回答我问题的人。

通过关注@Anders的答案,我发现我的问题就在这里。

我对Windows注册表进行了一些更改,因此浏览器知道将自定义协议字符串抛给某个程序。

这样的事情......

[InternetShortcut] URL = myProtocol:// ABCDEFG .....

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

在原生代码中,您可以致电GetStartupInfo,如果在STARTF_TITLEISLINKNAME中设置STARTUPINFO.dwFlags位,则.lnk的路径位于STARTUPINFO.lpTitle。我不知道是否有.NET方法来获取此信息,您可能需要P / Invoke ...

答案 2 :(得分:0)

如果您使用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”,这意味着通过你的应用程序的完整路径和文件名。你可以在这里添加其他东西,如果你需要将标志传递给你的应用程序做特殊的东西。所有这个infomaton都会在命令行上传递给你的应用程序,所以你需要熟悉“Environment.CommandLine”对象。

    如果您需要将其他操作设置为默认操作,只需右键单击操作并“设置为默认值”
  8. 即可

    基本上,您将文件路径作为参数传递给您的程序。然后,如果它是控制台应用程序或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];
        }
     }