WPF中OpenFileDialog显示.lnk文件,如何强制禁止显示快捷方式?
解决WPF OpenFileDialog显示PDF快捷方式的问题
这个问题我之前也碰到过——Windows的OpenFileDialog默认会“聪明地”解析快捷方式(.lnk文件),只要快捷方式指向的是PDF文件,就会把它混在过滤结果里显示出来,确实挺烦人的。给你两个解决思路,按需选择:
方法一:选中后拦截验证(简单易实现)
如果不想折腾底层接口,可以在用户确认选择后,检查选中的文件是不是快捷方式,要是的话就提示并取消操作:
using System.IO; using System.Windows; using Microsoft.Win32; var dialog = new OpenFileDialog { Multiselect = false, Filter = "Pdf Files|*.pdf", RestoreDirectory = true }; // 绑定确认事件,验证选中文件 dialog.FileOk += (sender, e) => { var selectedExt = Path.GetExtension(dialog.FileName); // 忽略大小写检查扩展名 if (string.Equals(selectedExt, ".lnk", StringComparison.OrdinalIgnoreCase)) { MessageBox.Show("请选择实际的PDF文件,不要选快捷方式哦~", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); e.Cancel = true; // 取消对话框的确认操作 } }; if (dialog.ShowDialog() == true) { // 这里处理真正的PDF文件 var targetPdfPath = dialog.FileName; // ...你的业务逻辑 }
方法二:强制隐藏快捷方式(更彻底)
如果想从根源上让.lnk文件不显示,需要用到Windows文件对话框的底层COM接口,设置FOS_NODEREFERENCELINKS标志——这个标志会告诉对话框不要解析快捷方式的目标,只看文件本身的扩展名,这样不符合.pdf的.lnk就会被直接过滤掉:
using System.Reflection; using System.Windows; using Microsoft.Win32; var dialog = new OpenFileDialog { Multiselect = false, Filter = "Pdf Files|*.pdf" }; // 获取WPF对话框底层的IFileDialog COM对象 var dialogType = typeof(OpenFileDialog); var privateDialogField = dialogType.GetField("_dialog", BindingFlags.NonPublic | BindingFlags.Instance); var iFileDialog = privateDialogField.GetValue(dialog); // 定义需要添加的标志:不解析快捷方式 const uint FOS_NODEREFERENCELINKS = 0x1000; // 获取当前的对话框选项,添加新标志后重新设置 var getOptionsMethod = iFileDialog.GetType().GetMethod("GetOptions", BindingFlags.Public | BindingFlags.Instance); uint currentOptions = (uint)getOptionsMethod.Invoke(iFileDialog, null); var setOptionsMethod = iFileDialog.GetType().GetMethod("SetOptions", BindingFlags.Public | BindingFlags.Instance); setOptionsMethod.Invoke(iFileDialog, new object[] { currentOptions | FOS_NODEREFERENCELINKS }); if (dialog.ShowDialog() == true) { var targetPdfPath = dialog.FileName; // ...你的业务逻辑 }
这个方法的优势是用户根本看不到任何.lnk文件,体验更流畅,推荐优先用这个方案。
内容的提问来源于stack exchange,提问作者Juan Salvador Portugal
相关产品推荐
相关产品推荐

