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

时间:2009-12-12 06:50:22

标签: winforms filtering openfiledialog

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

是否有一些神奇的开关可以打开,以便将它们包含在显示给用户的列表中?

目前,我必须通过将FileOk设置为e.Cancel来处理true事件处理程序中的条件,如果我检测到用户选择了*.URL文件(它是也没有100%的时间工作,一些快捷方式似乎仍然通过FileOk过滤器。但是,首先没有将它们列入列表会更好。

2 个答案:

答案 0 :(得分:2)

烦。您可以通过为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;
}

答案 1 :(得分:2)

Windows的“打开文件”常用对话框显示Internet快捷方式以及文件夹是正确的。我不知道为什么会出现这种行为,但它就在那里 - 它发生在Win32(尝试记事本验证)以及WinForms应用程序。

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

Dino Esposito在2003年11月写了一篇MSDN杂志的文章,展示了这项技术是如何运作的。本文不再出现在MSDN网站上,但您可以在此处获得有关返回机器的存档:http://web.archive.org/web/20150117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx

您可能需要做的是挂钩或子类化文件对话框的WndProc,手动查看文件列表控件,识别作为快捷方式的条目,并将Windows消息发送到文件列表控件以删除这些项目。然后,您需要注意该列表的刷新(例如,从目录更改)并重复过滤操作。

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

如果这是太多的工作或者黑客太多,我建议只使用FileOk事件来阻止用户通过从CancelEventHandler返回Cancel=true来获取FileOk事件。