代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

OpenFileDialog始终显示*.url(Internet快捷方式文件)

  •  1
  • Pierre Arnaud  · 技术社区  · 16 年前

    我的 OpenFileDialog 有一个 Filter 这也是 DefaultExt . 我想知道为什么当对话框打开时,我也会列出所有的Internet快捷方式(例如,可以获取文件夹的快捷方式,但不能获取*.url文件)。

    是否有一些魔术开关,我可以打开,以便让他们包括在显示给用户的列表中?

    目前,我必须处理 FileOk 通过设置的事件处理程序 e.Cancel true 如果我检测到用户选择了 *.URL 文件(它也不工作100%的时间,一些快捷方式似乎仍然通过 文件库 过滤器。不过,不把它们放在第一位会更好。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Justin Grant    10 年前

    正确的做法是,Windows的“打开文件”公共对话框显示Internet快捷方式以及文件夹。我不知道这种行为为什么存在,但它确实存在——它发生在win32(尝试使用记事本验证)和winforms应用程序中。

    有一种方法可以解决这个问题,但警告:这是黑客行为!如果从FileDialog类派生自定义文件对话框类,则可以访问一些受保护的事件,这些事件可用于自定义FileDialog操作的各个方面。

    Dino Esposito在2003年11月写了一篇msdn杂志文章,展示了这种技术的工作原理。这篇文章已不在msdn站点上,但您可以在Wayback机器的存档中找到它: http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx .

    您可能需要做的是挂接或子类化“文件”对话框的wndproc,手动查看“文件列表”控件,识别快捷方式条目,并向“文件列表”控件发送Windows消息以删除这些项。然后,您需要观察该列表的刷新(例如,目录更改),并重复筛选操作。

    这将是一个巨大的黑客,但这是可能的。

    如果这项工作太多或黑客行为太多,我建议您只使用fileok事件来阻止用户通过返回来选择快捷方式。 Cancel=true 从FileOK事件的CancelEventHandler。

        2
  •  2
  •   Hans Passant    16 年前

    烦人的。您可以通过实现fileok事件的处理程序来对它们进行重击,这样用户就永远无法选择其中一个:

    private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
      string ext = System.IO.Path.GetExtension(openFileDialog1.FileName);
      if (String.Compare(ext, ".url", true) == 0) e.Cancel = true;
    }
    
    推荐文章