Значок наложения в c # - PullRequest
       28

Значок наложения в c #

0 голосов
/ 15 февраля 2012

Прошу прощения, если это глупый вопрос. Но мне действительно нужно знать, как я могу использовать код, который я публикую ниже. Я скопировал это из формы. Я хочу реализовать наложение значка папки / файла. Поэтому во время поиска я нашел следующий код.

public sealed class ShellInterop
    {

        private ShellInterop()
        {
        }
        [DllImport("shell32.dll")]
        public static extern void SHChangeNotify(int eventID, uint flags, IntPtr item1, IntPtr item2);

    }

    [ComVisible(false)]
    [ComImport]
    [Guid("0C6C4200-C589-11D0-999A-00C04FD655E1")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IShellIconOverlayIdentifier
    {

        [PreserveSig]
        int IsMemberOf([MarshalAs(UnmanagedType.LPWStr)]string path, uint attributes);

        [PreserveSig]
        int GetOverlayInfo(
            IntPtr iconFileBuffer,
            int iconFileBufferSize,
            out int iconIndex,
            out uint flags);

        [PreserveSig]
        int GetPriority(out int priority);
    }

    [ComVisible(true)]
    [Guid("B8FA9E43-38E6-4654-8A13-FF905AD22CE5")]
    public class MyIconOverlay : IShellIconOverlayIdentifier
    {

        #region IShellIconOverlayIdentifier Members
        public int IsMemberOf(string path, uint attributes)
        {
            //Show everything with icon overlay
            return 0; // S_OK
        }

        public int GetOverlayInfo(IntPtr iconFileBuffer, int
        iconFileBufferSize,
        out int iconIndex, out uint flags)
        {

            System.Diagnostics.Debug.WriteLine(string.Format("GetOverlayInfo::{0}", iconFileBuffer));

            System.Diagnostics.Debug.WriteLine(string.Format("GetOverlayInfo::{0}", iconFileBufferSize));
            string fname = @"c:\NormalIcon.ico";

            int bytesCount = System.Text.Encoding.Unicode.GetByteCount(fname);

            System.Diagnostics.Debug.WriteLine(string.Format("GetOverlayInfo::{0}", bytesCount));

            byte[] bytes = System.Text.Encoding.Unicode.GetBytes(fname);

            if (bytes.Length + 2 < iconFileBufferSize)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    Marshal.WriteByte(iconFileBuffer, i, bytes[i]);
                }
                //write the "\0\0"
                Marshal.WriteByte(iconFileBuffer, bytes.Length, 0);
                Marshal.WriteByte(iconFileBuffer, bytes.Length + 1, 0);
            }

            iconIndex = 0;
            flags = 1; // ISIOI_ICONFILE
            return 0; // S_OK
        }


        public int GetPriority(out int priority)
        {
            priority = 0; // 0-100 (0 is highest priority)
            return 0; // S_OK
        }
        #endregion

        #region Registry
        [ComRegisterFunction]
        public static void Register(Type t)
        {
            RegistryKey rk = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\_"
            + t.Name);
            rk.SetValue(string.Empty, t.GUID.ToString("B").ToUpper());
            rk.Close();
            ShellInterop.SHChangeNotify(0x08000000, 0, IntPtr.Zero, IntPtr.Zero);
        }

        [ComUnregisterFunction]
        public static void Unregister(Type t)
        {
            Registry.LocalMachine.DeleteSubKeyTree(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\_"
            + t.Name);
            ShellInterop.SHChangeNotify(0x08000000, 0, IntPtr.Zero, IntPtr.Zero);
        }
        #endregion
    }

Пожалуйста, если кто-нибудь сможет мне это объяснить. У меня есть ситуация, когда мне нужно реализовать наложение значков для файлов и папок, которые пользователь создает в специальной папке.

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2012

(редактировать: исправлено regasvr32 в regasm, извините за мою ошибку)

Этот код состоит из трех основных частей: 1) Сигнатура взаимодействия для IShellIconOverlayIdentifier, интерфейса, используемого оболочкой для добавления значков. 2) MyOverlay, реализация этого интерфейса, добавляющая (я предполагаю) "normalIcon.ico" в качестве оверлея.

3) (это важная часть) код для регистрации и отмены регистрации MyOverlay в качестве расширения оболочки в реестре.

Я не слишком знаком со спецификой наложения значков, но, похоже, что для этого вам нужно вызвать метод Register. Поскольку он помечен [ComRegisterFunction], я предполагаю, что все, что вам нужно сделать из командной строки с правами администратора, это вызвать

C:\> regasm <path to your DLL>

который должен позвонить в регистр. Аналогично с regasm /u <path> для удаления. Попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...