Пример #1
0
        /// <summary>
        ///	変数などを初期化する。
        /// </summary>
        private static void Initialize()
        {
            m_bInitialized = true;

            ShellAPI.SHFILEINFO shInfo    = new ShellAPI.SHFILEINFO();
            ShellAPI.SHGFI      dwAttribs =
                ShellAPI.SHGFI.SHGFI_USEFILEATTRIBUTES |
                ShellAPI.SHGFI.SHGFI_SMALLICON |
                ShellAPI.SHGFI.SHGFI_SYSICONINDEX;
            m_himlSmall = ShellAPI.SHGetFileInfoW(".txt", ShellAPI.FILE_ATTRIBUTE_NORMAL, out shInfo, (uint)Marshal.SizeOf(shInfo), dwAttribs);
            if (m_himlSmall.Equals(IntPtr.Zero))
            {
                throw new Exception("小システムイメージリストを取得できませんでした。");
            }

            dwAttribs =
                ShellAPI.SHGFI.SHGFI_USEFILEATTRIBUTES |
                ShellAPI.SHGFI.SHGFI_LARGEICON |
                ShellAPI.SHGFI.SHGFI_SYSICONINDEX;
            m_himlLarge = ShellAPI.SHGetFileInfoW(".txt", ShellAPI.FILE_ATTRIBUTE_NORMAL, out shInfo, (uint)Marshal.SizeOf(shInfo), dwAttribs);
            if (m_himlLarge.Equals(IntPtr.Zero))
            {
                throw new Exception("大システムイメージリストを取得できませんでした。");
            }
        }
Пример #2
0
        /// <summary>
        ///	属性を初期化する。
        /// </summary>
        private void InitAtr(InitMode mode, IntPtr pIDL, ShellAPI.IShellFolder parentSf)
        {
            //	基本的な属性を初期化する
            ShellAPI.SFGAOF uFlags = 0;
            switch (mode)
            {
            case InitMode.Desktop:
            {
                this.IsFolder     = true;
                this.IsFileSystem = false;
                this.HasSubFolder = true;
            }
            break;

            case InitMode.Path:
            case InitMode.Child:
            {
                uFlags =
                    ShellAPI.SFGAOF.SFGAO_FOLDER |
                    ShellAPI.SFGAOF.SFGAO_FILESYSTEM |
                    ShellAPI.SFGAOF.SFGAO_FILESYSANCESTOR;
                parentSf.GetAttributesOf(1, out pIDL, out uFlags);
                this.IsFolder     = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FOLDER);
                this.IsFileSystem = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FILESYSTEM);

                if (this.IsFolder)
                {
                    //	GetAttributesOf で SFGAO_HASSUBFOLDER を調べるとかなり遅くなる、
                    //	そもそも this.HasSubFolder はヒントとして使用するだけなのでフォルダの場合は問答無用で
                    //	this.HasSubFolder に true をセットする
                    this.HasSubFolder = true;

                    //	このオブジェクト用の IShellFolder インターフェース取得
                    m_ShellFolder = ShellAPI.BindToIShellFolder(parentSf, pIDL);
                }
            }
            break;
            }

            //	パス名取得
            m_Path = ShellAPI.SHGetPathFromIDList(m_pIDL);

            //	アイコンインデックス番号とかの属性取得
            ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO();
            ShellAPI.SHGetFileInfoW(
                m_pIDL,
                0,
                out shInfo,
                (uint)Marshal.SizeOf(shInfo),
                ShellAPI.SHGFI.SHGFI_SMALLICON |
                ShellAPI.SHGFI.SHGFI_SYSICONINDEX |
                ShellAPI.SHGFI.SHGFI_PIDL |
                ShellAPI.SHGFI.SHGFI_DISPLAYNAME |
                ShellAPI.SHGFI.SHGFI_TYPENAME
                );
            m_DisplayName = shInfo.szDisplayName;
            m_TypeName    = shInfo.szTypeName;
            m_iIconIndex  = shInfo.iIcon;

            //	選択時のアイコンインデックス番号取得
            ShellAPI.SHGetFileInfoW(
                m_pIDL,
                0,
                out shInfo,
                (uint)Marshal.SizeOf(shInfo),
                ShellAPI.SHGFI.SHGFI_PIDL |
                ShellAPI.SHGFI.SHGFI_SMALLICON |
                ShellAPI.SHGFI.SHGFI_SYSICONINDEX |
                ShellAPI.SHGFI.SHGFI_OPENICON
                );
            m_iSelectedIconIndex = shInfo.iIcon;

            //	いろいろ調べてアイテム種類(m_ItemType)を確定する
            if (this.IsFileSystem)
            {
                bool bValidated = false;
                m_FileName = "";

                try
                {
                    m_FileName = System.IO.Path.GetFileName(m_Path);

                    if (this.IsFolder)
                    {
                        if (System.IO.Path.GetPathRoot(m_Path) == m_Path)
                        {
                            //	パス名とルートパスが同じならドライブのはず
                            m_ItemType = ShellItemType.Drive;
                            bValidated = true;
                        }
                        else if (Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FILESYSANCESTOR))
                        {
                            //	ファイルシステムアイテムを含むことができるフォルダ=ファイルフォルダ(だと思う)
                            m_ItemType = ShellItemType.Folder;
                            bValidated = true;
                        }
                    }
                }
                catch
                {
                    //	システムのアイテムの場合まともなパス名ではなくて、例外が出ちゃうので
                    //	ここで例外キャッチ
                }

                if (!bValidated)
                {
                    m_ItemType = ShellItemType.File;
                    bValidated = true;
                }
            }
            else
            {
                if (this.IsFolder)
                {
                    m_ItemType = ShellItemType.SpecialFolder;
                }
                else
                {
                    m_ItemType = ShellItemType.SpecialItem;
                }
            }
        }