Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Extend OpenFileDialog and SaveFileDialog the easy way

, 22 Mar 2012 CPOL
Customize OpenFileDialog and SaveFileDialog using a User Control
CustomFileDialog_old.zip
CustomFileDialog
Properties
Settings.settings
FileDlgExtenders
Properties
CustomFileDialog_src2.zip
VB_Code
FileDlgExtenders
CSharp_Code
FileDlgExtenders
Properties
Properties
My Project
Settings.settings
My Project
Settings.settings
bin
release
bin
Debug
Release
obj
Debug
DesignTimeResolveAssemblyReferencesInput.cache
Refactor
FileDlgExtenders.dll
TempPE
Release
Refactor
TempPE
CustomFileDialog_src_old.zip
C__Projects_CustomFileDialog_src2.zip
Settings.settings
Settings.settings
DesignTimeResolveAssemblyReferencesInput.cache
FileDlgExtenders.dll
CustomFileDialog_src_old.zip
C__Projects_release2.zip
FileDlgExtenders.dll
CustomOpenFileDialog.exe
release2.zip
FileDlgExtenders.dll
CustomOpenFileDialog.exe
//  Copyright (c) 2006, Gustavo Franco
//  Copyright © Decebal Mihailescu 2010

//  Email:  gustavo_franco@hotmail.com
//  All rights reserved.

//  Redistribution and use in source and binary forms, with or without modification, 
//  are permitted provided that the following conditions are met:

//  Redistributions of source code must retain the above copyright notice, 
//  this list of conditions and the following disclaimer. 
//  Redistributions in binary form must reproduce the above copyright notice, 
//  this list of conditions and the following disclaimer in the documentation 
//  and/or other materials provided with the distribution. 

//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
//  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
//  PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER 
//  REMAINS UNCHANGED.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Win32Types;
using System.ComponentModel;
using Microsoft.Win32;

namespace FileDialogExtenders
{
    public static class Extensions
    {
        #region extension Methods
        public static DialogResult ShowDialog(this FileDialog fdlg, FileDialogControlBase ctrl, IWin32Window owner) //where T : FileDialogControlBase, new()
        {
            ctrl.FileDlgType = (fdlg is SaveFileDialog) ? FileDialogType.SaveFileDlg : FileDialogType.OpenFileDlg;
            if (ctrl.ShowDialogExt(fdlg, owner) == DialogResult.OK)
                return DialogResult.OK;
            else
                return DialogResult.Ignore;
        }
        #endregion
    }

    //see http://msdn.microsoft.com/en-us/magazine/cc300434.aspx
    public static class FileDialogPlaces
    {
        private static readonly string TempKeyName = "TempPredefKey_" + Guid.NewGuid().ToString();
        private const string Key_PlacesBar = @"Software\Microsoft\Windows\CurrentVersion\Policies\ComDlg32\PlacesBar";
        private static RegistryKey _fakeKey;
        private static IntPtr _overriddenKey;
        private static object[] m_places;

        public static void SetPlaces(this FileDialog fd, object[] places)
        {
            if (fd == null || places == null)
                return;
            if (m_places == null)
                m_places = new object[places.GetLength(0)];

            for (int i = 0; i < m_places.GetLength(0); i++)
            {
                m_places[i] = places[i];
            }

            if (_fakeKey != null)
                ResetPlaces(fd);
            SetupFakeRegistryTree();
            if (fd != null)
                fd.Disposed += (object sender, EventArgs e) => { if (m_places != null && fd != null) ResetPlaces(fd); };
        }

        static FileDialogPlaces()
        {
        }

        static public void ResetPlaces(this FileDialog fd)
        {
            if (_overriddenKey != IntPtr.Zero)
            {
                ResetRegistry(_overriddenKey);
                _overriddenKey = IntPtr.Zero;
            }
            if (_fakeKey != null)
            {
                _fakeKey.Close();
                _fakeKey = null;
            }
            //delete the key tree
            Registry.CurrentUser.DeleteSubKeyTree(TempKeyName);
            m_places = null;
        }

        private static void SetupFakeRegistryTree()
        {
            try
            {
                _fakeKey = Registry.CurrentUser.CreateSubKey(TempKeyName);
                _overriddenKey = InitializeRegistry();

                // at this point, m_TempKeyName equals places key
                // write dynamic places here reading from Places
                RegistryKey reg = Registry.CurrentUser.CreateSubKey(Key_PlacesBar);
                for (int i = 0; i < m_places.GetLength(0); i++)
                {
                    if (m_places[i] != null)
                    {
                        reg.SetValue("Place" + i.ToString(), m_places[i]);
                    }
                }
            }
            catch
            {
            }
        }

        //public static IntPtr GetRegistryHandle(RegistryKey registryKey)
        //{
        //    Type type = registryKey.GetType();
        //    FieldInfo fieldInfo = type.GetField("hkey", BindingFlags.Instance | BindingFlags.NonPublic);
        //    return (IntPtr)fieldInfo.GetValue(registryKey);
        //}
        static readonly UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);
        private static IntPtr InitializeRegistry()
        {
            IntPtr hkMyCU;
            NativeMethods.RegCreateKeyW(HKEY_CURRENT_USER, TempKeyName, out hkMyCU);
            NativeMethods.RegOverridePredefKey(HKEY_CURRENT_USER, hkMyCU);
            return hkMyCU;
        }


        static void ResetRegistry(IntPtr hkMyCU)
        {
            try
            {
                NativeMethods.RegOverridePredefKey(HKEY_CURRENT_USER, IntPtr.Zero);
                NativeMethods.RegCloseKey(hkMyCU);
            }
            catch 
            {
            }
        }

    }

    //http://www.codeguru.com/cpp/misc/misc/system/article.php/c13407/
    // fot .net 4.0 and up use CustomPlaces instead :http://msdn.microsoft.com/en-us/library/microsoft.win32.filedialog.customplaces.aspx
    public enum Places
    {
        [Description("Desktop")]
        Desktop = 0,

        [Description("Internet Explorer ")]
        InternetExplorer = 1,

        [Description("Program Files")]
        Programs = 2,

        [Description("Control Panel")]
        ControlPanel = 3,

        [Description("Printers")]
        Printers = 4,

        [Description("My Documents")]
        MyDocuments = 5,

        [Description("Favorites")]
        Favorites = 6,

        [Description("Startup folder")]
        StartupFolder = 7,

        [Description("Recent Files")]
        RecentFiles = 8,

        [Description("Send To")]
        SendTo = 9,

        [Description("Recycle Bin")]
        RecycleBin = 0xa,

        [Description("Start menu")]
        StartMenu = 0xb,

        [Description("Logical My Documents")]
        Logical_MyDocuments = 0xc,

        [Description("My Music")]
        MyMusic = 0xd,

        [Description("My Videos")]
        MyVideos = 0xe,

        [Description("<user name>\\Desktop")]
        UserName_Desktop = 0x10,

        [Description("My Computer")]
        MyComputer = 0x11,


        [Description("My Network Places")]
        MyNetworkPlaces = 18,

        [Description("<user name>\nethood")]
        User_Name_Nethood = 0x13,

        [Description("Fonts")]
        Fonts = 0x14,

        [Description("All Users\\Start Menu")]
        All_Users_StartMenu = 0x16,


        [Description("All Users\\Start Menu\\Programs ")]
        All_Users_StartMenu_Programs = 0x17,

        [Description("All Users\\Startup")]
        All_Users_Startup = 0x18,

        [Description("All Users\\Desktop")]
        All_Users_Desktop = 0x19,


        [Description("<user name>\\Application Data ")]
        User_name_ApplicationData = 0x1a,


        [Description("<user name>\\PrintHood ")]
        User_Name_PrintHood = 0x1b,

        [Description("<user name>\\Local Settings\\Applicaiton Data (nonroaming)")]
        Local_ApplicaitonData = 0x1c,

        [Description("Nonlocalized common startup ")]
        NonlocalizedCommonStartup = 0x1e,

        [Description("")]
        CommonFavorites = 0x1f,


        [Description("Internet Cache ")]
        InternetCache = 0x20,


        [Description("Cookies ")]
        Cookies = 0x21,


        [Description("History")]
        History = 0x22,


        [Description("All Users\\Application Data ")]
        All_Users_ApplicationData = 0x23,


        [Description("Windows Directory")]
        WindowsDirectory = 0x24,


        [Description("System Directory")]
        SystemDirectory = 0x25,


        [Description("Program Files ")]
        ProgramFiles = 0x26,


        [Description("My Pictures ")]
        MyPictures = 0x27,


        [Description("USERPROFILE")]
        USERPROFILE = 0x28,

        [Description("system directory on RISC")]
        SYSTEN_RISC = 0x29,

        [Description("Program Files on RISC ")]
        Program_Files_RISC = 0x2a,


        [Description("Program Files\\Common")]
        Common = 0x2b,
        [Description("Program Files\\Common on RISC")]
        Common_RISC = 0x2c,
        [Description("All Users\\Templates ")]
        Templates = 0x2d,
        [Description("All Users\\Documents")]
        All_Users_Documents = 0x2e,
        [Description("All Users\\Start Menu\\Programs\\Administrative Tools")]
        AdministrativeTools = 0x2f,
        [Description("<user name>\\Start Menu\\Programs\\Administrative Tools")]
        USER_AdministrativeTools = 0x30,
        [Description("Network and Dial-up Connections")]
        Network_DialUp_Connections = 0x31,
        [Description("All Users\\My Music")]
        All_Users_MyMusic = 0x35,
        [Description("All Users\\My Pictures")]
        All_Users_MyPictures = 0x36,
        [Description("All Users\\My Video")]
        All_Users_MyVideo = 0x37,
        [Description("Resource Directory")]
        Resource = 0x38,
        [Description("Localized Resource Directory ")]
        Localized_Resource = 0x39,
        [Description("OEM specific apps")]
        OEM_Specific = 0x3a,
        [Description("USERPROFILE\\Local Settings\\Application Data\\Microsoft\\CD Burning")]
        CDBurning = 0x3b

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

dmihailescu
Software Developer (Senior)
United States United States
Decebal Mihailescu is a software engineer with interest in .Net, C# and C++.

| Advertise | Privacy | Mobile
Web04 | 2.8.141022.2 | Last Updated 22 Mar 2012
Article Copyright 2007 by dmihailescu
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid