对于未设置为在浏览器中打开的文件类型,您可以依赖一个不可见的WebBroser 控件并调用Navigate 方法并将临时文件名传递给它:
webBrowser1.Navigate(@"C:\windows\temp\somefile.xyz");
如果不满意,您需要滚动自己的对话框。
创建自定义下载对话框
如果您决定实现自定义对话框,您可以使用SHGetFileInfo 提取有关文件的信息,包括图标和文件类型描述。
例如,首先声明SHGetFileInfo和SHFILEINFO结构和所需的常量:
[DllImport("shell32")]
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes,
out SHFILEINFO psfi, uint cbFileInfo, uint uflags);
[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO {
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;
private const uint SHGFI_ICON = 0x000000100;
private const uint SHGFI_DISPLAYNAME = 0x000000200;
private const uint SHGFI_TYPENAME = 0x000000400;
private const uint SHGFI_ATTRIBUTES = 0x000000800;
那么你可以这样使用方法:
var info = new SHFILEINFO();
SHGetFileInfo(filename, FILE_ATTRIBUTE_NORMAL, out info, (uint)Marshal.SizeOf(info),
SHGFI_ICON | SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
var fileDisplayName = info.szDisplayName;
var fileTypeName = info.szTypeName;
var fileTypeImage = Icon.FromHandle(info.hIcon).ToBitmap();
那么你就可以有这样的对话框了:
下载示例
您可以从以下存储库下载一个工作示例: