如何使用OpenFileDialog读取所有数据快捷方式

本文关键字:数据 快捷方式 读取 何使用 OpenFileDialog | 更新日期: 2023-09-27 18:21:33

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

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
        }
    }
}

如何使用OpenFileDialog读取所有数据快捷方式

我不明白这里的问题是什么。你说你已经发现了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
}

否则,取消引用快捷方式文件需要付出相当大的努力。您使用IShellLink COM接口来实现这一点,我不认为它是由.NET BCL的任何部分显式包装的。您需要编写代码才能自己使用它我无法想象在这种情况下你为什么需要这样做

如果您需要从快捷方式文件中读取参数,则必须执行此操作。

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

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