0

我正在制作一个启动器来打开我电脑上的所有应用程序。但是不知道怎么读取打开文件的参数是快捷方式。我试过使用:

openFileDialog.DereferenceLinks = false; //and true

谁能帮我?我的代码在这里:

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog od = new OpenFileDialog();
    od.DereferenceLinks = false;
    od.Multiselect = false;
    od.SupportMultiDottedExtensions = true;

    if (od.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        if (System.IO.Path.GetExtension(od.FileName).ToLower().Equals(".lnk"))
        {
            MessageBox.Show(//xxxxxxx how to sho the parameter?); for example output c:\\.....\hl.exe -a -b -c -d -e 29332
        }
    }
}
4

1 回答 1

2

我不明白这里有什么问题。您说您已经发现了该FileDialog.DereferenceLinks属性,这正是您想要的。

当它设置为true时,对话框取消引用所有快捷方式,返回它们指向的项目的路径,而不是快捷方式文件本身的路径。只有当它设置为时,您才会获得从对话框返回的false带有扩展名的文件。.lnk

因此,您刚刚添加到问题中的代码是错误的(或者至少,使您的事情变得比需要的困难得多)。它应该看起来更像这样:

OpenFileDialog od = new OpenFileDialog();
od.DereferenceLinks = true;  // set this to true if you want the actual file
od.Multiselect = false;
od.SupportMultiDottedExtensions = true;

if (od.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    // You will never get a path to a shortcut file (*.lnk) here.
    Debug.Assert(!String.Equals(System.IO.Path.GetExtension(od.FileName),
                                ".lnk",
                                StringComparison.OrdinalIgnoreCase));

    // ... do something with the file
}

否则,取消引用快捷方式文件需要相当多的努力。您可以使用IShellLinkCOM 接口来执行此操作,我认为它不会被 .NET BCL 的任何部分显式包装。您需要编写代码才能自己使用它。我无法想象为什么你需要在这种情况下。

如果您需要从快捷方式文件中读取参数,这就是您必须要做的。

  1. OpenFileDialog.DereferenceLinks将该属性设置为,false以便您获得返回的快捷方式文件。
  2. 您可能还希望将OpenFileDialog.Filter属性设置Shortcut files (*.lnk)|*.lnk为以确保用户只能在对话框中选择快捷方式文件。
  3. 一旦用户选择了一个快捷方式文件,IShellLink就为该文件创建一个对象。
  4. 如果成功,请使用GetPath方法获取包含快捷方式文件的路径和文件名的GetArguments字符串,并使用方法获取包含与该快捷方式文件关联的命令行参数的字符串。
  5. 最后,将参数字符串附加到路径字符串的末尾。

您可以自己编写包装器代码以使用IShellLink.NET 中的 COM 接口,在线搜索以找到已经编写的代码(但不能保证其质量),或者添加对ShellLinkObject设计用于脚本但仍然存在的类的引用可从 .NET 使用

于 2013-07-09T10:41:26.930 回答