Statistics
| Branch: | Revision:

root / trunk / Pithos.ShellExtensions / ShellExtLib.cs @ 96f88218

History | View | Annotate | Download (33.4 kB)

1 255f5f86 Panagiotis Kanavos
#region
2 255f5f86 Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 255f5f86 Panagiotis Kanavos
 * <copyright file="ShellExtLib.cs" company="GRNet">
4 255f5f86 Panagiotis Kanavos
 * 
5 255f5f86 Panagiotis Kanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 255f5f86 Panagiotis Kanavos
 *
7 255f5f86 Panagiotis Kanavos
 * Redistribution and use in source and binary forms, with or
8 255f5f86 Panagiotis Kanavos
 * without modification, are permitted provided that the following
9 255f5f86 Panagiotis Kanavos
 * conditions are met:
10 255f5f86 Panagiotis Kanavos
 *
11 255f5f86 Panagiotis Kanavos
 *   1. Redistributions of source code must retain the above
12 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
13 255f5f86 Panagiotis Kanavos
 *      disclaimer.
14 255f5f86 Panagiotis Kanavos
 *
15 255f5f86 Panagiotis Kanavos
 *   2. Redistributions in binary form must reproduce the above
16 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
17 255f5f86 Panagiotis Kanavos
 *      disclaimer in the documentation and/or other materials
18 255f5f86 Panagiotis Kanavos
 *      provided with the distribution.
19 255f5f86 Panagiotis Kanavos
 *
20 255f5f86 Panagiotis Kanavos
 *
21 255f5f86 Panagiotis Kanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 255f5f86 Panagiotis Kanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 255f5f86 Panagiotis Kanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 255f5f86 Panagiotis Kanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 255f5f86 Panagiotis Kanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 255f5f86 Panagiotis Kanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 255f5f86 Panagiotis Kanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 255f5f86 Panagiotis Kanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 255f5f86 Panagiotis Kanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 255f5f86 Panagiotis Kanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 255f5f86 Panagiotis Kanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 255f5f86 Panagiotis Kanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 255f5f86 Panagiotis Kanavos
 *
34 255f5f86 Panagiotis Kanavos
 * The views and conclusions contained in the software and
35 255f5f86 Panagiotis Kanavos
 * documentation are those of the authors and should not be
36 255f5f86 Panagiotis Kanavos
 * interpreted as representing official policies, either expressed
37 255f5f86 Panagiotis Kanavos
 * or implied, of GRNET S.A.
38 255f5f86 Panagiotis Kanavos
 * </copyright>
39 255f5f86 Panagiotis Kanavos
 * -----------------------------------------------------------------------
40 255f5f86 Panagiotis Kanavos
 */
41 255f5f86 Panagiotis Kanavos
#endregion
42 255f5f86 Panagiotis Kanavos
using System;
43 d78cbf09 Panagiotis Kanavos
using System.Diagnostics;
44 d78cbf09 Panagiotis Kanavos
using System.Text;
45 d78cbf09 Panagiotis Kanavos
using Microsoft.Win32;
46 d78cbf09 Panagiotis Kanavos
using System.Runtime.InteropServices;
47 d78cbf09 Panagiotis Kanavos
using System.Runtime.InteropServices.ComTypes;
48 d78cbf09 Panagiotis Kanavos
49 d78cbf09 Panagiotis Kanavos
50 d78cbf09 Panagiotis Kanavos
namespace Pithos.ShellExtensions
51 d78cbf09 Panagiotis Kanavos
{
52 d78cbf09 Panagiotis Kanavos
    #region Shell Interfaces
53 d78cbf09 Panagiotis Kanavos
    [Flags]
54 d78cbf09 Panagiotis Kanavos
    public enum ISIOI
55 d78cbf09 Panagiotis Kanavos
    {
56 d78cbf09 Panagiotis Kanavos
        ISIOI_ICONFILE = 1,
57 d78cbf09 Panagiotis Kanavos
        ISIOI_ICONINDEX = 2
58 d78cbf09 Panagiotis Kanavos
    }
59 d78cbf09 Panagiotis Kanavos
60 d78cbf09 Panagiotis Kanavos
    [ComVisible(false)]
61 d78cbf09 Panagiotis Kanavos
    [ComImport]
62 d78cbf09 Panagiotis Kanavos
    [Guid("0C6C4200-C589-11D0-999A-00C04FD655E1")]
63 d78cbf09 Panagiotis Kanavos
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
64 d78cbf09 Panagiotis Kanavos
    public interface IShellIconOverlayIdentifier
65 d78cbf09 Panagiotis Kanavos
    {
66 d78cbf09 Panagiotis Kanavos
67 d78cbf09 Panagiotis Kanavos
        [PreserveSig]
68 d78cbf09 Panagiotis Kanavos
        int IsMemberOf(
69 d78cbf09 Panagiotis Kanavos
            [MarshalAs(UnmanagedType.LPWStr)] string path,
70 d78cbf09 Panagiotis Kanavos
71 d78cbf09 Panagiotis Kanavos
            uint attributes);
72 d78cbf09 Panagiotis Kanavos
73 d78cbf09 Panagiotis Kanavos
        [PreserveSig]
74 d78cbf09 Panagiotis Kanavos
        int GetOverlayInfo(
75 d78cbf09 Panagiotis Kanavos
            IntPtr iconFileBuffer,
76 d78cbf09 Panagiotis Kanavos
            int iconFileBufferSize,
77 d78cbf09 Panagiotis Kanavos
            out int iconIndex,
78 d78cbf09 Panagiotis Kanavos
            out uint flags);
79 d78cbf09 Panagiotis Kanavos
80 d78cbf09 Panagiotis Kanavos
        [PreserveSig]
81 d78cbf09 Panagiotis Kanavos
        int GetPriority(
82 d78cbf09 Panagiotis Kanavos
            out int priority);
83 d78cbf09 Panagiotis Kanavos
84 d78cbf09 Panagiotis Kanavos
    }
85 d78cbf09 Panagiotis Kanavos
86 d78cbf09 Panagiotis Kanavos
87 d78cbf09 Panagiotis Kanavos
88 d78cbf09 Panagiotis Kanavos
    [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
89 d78cbf09 Panagiotis Kanavos
    [Guid("000214e8-0000-0000-c000-000000000046")]
90 d78cbf09 Panagiotis Kanavos
    internal interface IShellExtInit
91 d78cbf09 Panagiotis Kanavos
    {
92 d78cbf09 Panagiotis Kanavos
        void Initialize(
93 d78cbf09 Panagiotis Kanavos
            IntPtr /*LPCITEMIDLIST*/ pidlFolder,
94 d78cbf09 Panagiotis Kanavos
            IntPtr /*LPDATAOBJECT*/ pDataObj,
95 d78cbf09 Panagiotis Kanavos
            IntPtr /*HKEY*/ hKeyProgID);
96 d78cbf09 Panagiotis Kanavos
    }
97 d78cbf09 Panagiotis Kanavos
98 d78cbf09 Panagiotis Kanavos
99 d78cbf09 Panagiotis Kanavos
    [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
100 d78cbf09 Panagiotis Kanavos
    [Guid("000214e4-0000-0000-c000-000000000046")]
101 d78cbf09 Panagiotis Kanavos
    internal interface IContextMenu
102 d78cbf09 Panagiotis Kanavos
    {
103 d78cbf09 Panagiotis Kanavos
        [PreserveSig]
104 d78cbf09 Panagiotis Kanavos
        int QueryContextMenu(
105 d78cbf09 Panagiotis Kanavos
            IntPtr /*HMENU*/ hMenu,
106 d78cbf09 Panagiotis Kanavos
            uint iMenu,
107 d78cbf09 Panagiotis Kanavos
            uint idCmdFirst,
108 d78cbf09 Panagiotis Kanavos
            uint idCmdLast,
109 d78cbf09 Panagiotis Kanavos
            uint uFlags);
110 d78cbf09 Panagiotis Kanavos
111 d78cbf09 Panagiotis Kanavos
        void InvokeCommand(IntPtr pici);
112 d78cbf09 Panagiotis Kanavos
113 d78cbf09 Panagiotis Kanavos
        void GetCommandString(
114 d78cbf09 Panagiotis Kanavos
            UIntPtr idCmd,
115 d78cbf09 Panagiotis Kanavos
            uint uFlags,
116 d78cbf09 Panagiotis Kanavos
            IntPtr pReserved,
117 d78cbf09 Panagiotis Kanavos
            StringBuilder pszName,
118 d78cbf09 Panagiotis Kanavos
            uint cchMax);
119 d78cbf09 Panagiotis Kanavos
    }
120 d78cbf09 Panagiotis Kanavos
121 d78cbf09 Panagiotis Kanavos
    #endregion
122 d78cbf09 Panagiotis Kanavos
123 d78cbf09 Panagiotis Kanavos
124 d78cbf09 Panagiotis Kanavos
    #region Shell Registration
125 d78cbf09 Panagiotis Kanavos
126 d78cbf09 Panagiotis Kanavos
    internal class ShellExtReg
127 d78cbf09 Panagiotis Kanavos
    {
128 d78cbf09 Panagiotis Kanavos
        private const string _approvedKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved";
129 d78cbf09 Panagiotis Kanavos
130 d78cbf09 Panagiotis Kanavos
        public static void RegisterIconOverlayIdentifier(Guid clsid,
131 d78cbf09 Panagiotis Kanavos
            string friendlyName)
132 d78cbf09 Panagiotis Kanavos
        {
133 d78cbf09 Panagiotis Kanavos
            if (clsid == Guid.Empty)
134 d78cbf09 Panagiotis Kanavos
            {
135 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("clsid must not be empty");
136 d78cbf09 Panagiotis Kanavos
            }
137 d78cbf09 Panagiotis Kanavos
            if (string.IsNullOrEmpty(friendlyName))
138 d78cbf09 Panagiotis Kanavos
            {
139 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("friendlyName must not be null or empty");
140 d78cbf09 Panagiotis Kanavos
            }
141 d78cbf09 Panagiotis Kanavos
142 29672672 Panagiotis Kanavos
            // Create the key HKLM\SOFTWARE\TortoiseOverlays\<IconName>\Pithos={<CLSID>}.
143 29672672 Panagiotis Kanavos
            string keyName = string.Format(@"SOFTWARE\TortoiseOverlays\{0}",
144 d78cbf09 Panagiotis Kanavos
                friendlyName);
145 29672672 Panagiotis Kanavos
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyName,true))
146 d78cbf09 Panagiotis Kanavos
            {
147 d78cbf09 Panagiotis Kanavos
                // Set the default value of the key.
148 d78cbf09 Panagiotis Kanavos
                if (key != null)//&& !string.IsNullOrEmpty(clsid.ToString("B")))
149 d78cbf09 Panagiotis Kanavos
                {
150 29672672 Panagiotis Kanavos
                    key.SetValue("Pithos", clsid.ToString("B"),RegistryValueKind.String);
151 d78cbf09 Panagiotis Kanavos
                }
152 d78cbf09 Panagiotis Kanavos
            }
153 d78cbf09 Panagiotis Kanavos
        }
154 d78cbf09 Panagiotis Kanavos
155 d78cbf09 Panagiotis Kanavos
        internal static void UnregisterIconOverlayIdentifier(Guid clsid,
156 d78cbf09 Panagiotis Kanavos
            string friendlyName)
157 d78cbf09 Panagiotis Kanavos
        {
158 d78cbf09 Panagiotis Kanavos
            if (clsid == null)
159 d78cbf09 Panagiotis Kanavos
            {
160 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("clsid must not be null");
161 d78cbf09 Panagiotis Kanavos
            }
162 d78cbf09 Panagiotis Kanavos
            if (string.IsNullOrEmpty(friendlyName))
163 d78cbf09 Panagiotis Kanavos
            {
164 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("friendlyName must not be null or empty");
165 d78cbf09 Panagiotis Kanavos
            }
166 d78cbf09 Panagiotis Kanavos
167 d78cbf09 Panagiotis Kanavos
168 29672672 Panagiotis Kanavos
            string keyName = string.Format(@"SOFTWARE\TortoiseOverlays\{0}",
169 d78cbf09 Panagiotis Kanavos
                friendlyName);
170 29672672 Panagiotis Kanavos
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyName, true))
171 29672672 Panagiotis Kanavos
            {
172 29672672 Panagiotis Kanavos
                // Set the default value of the key.
173 29672672 Panagiotis Kanavos
                if (key != null)//&& !string.IsNullOrEmpty(clsid.ToString("B")))
174 29672672 Panagiotis Kanavos
                {
175 29672672 Panagiotis Kanavos
                    key.DeleteValue("Pithos");
176 29672672 Panagiotis Kanavos
                }
177 29672672 Panagiotis Kanavos
            }
178 d78cbf09 Panagiotis Kanavos
        }
179 d78cbf09 Panagiotis Kanavos
180 d78cbf09 Panagiotis Kanavos
181 d78cbf09 Panagiotis Kanavos
        /// <summary>
182 d78cbf09 Panagiotis Kanavos
        /// Register the context menu handler.
183 d78cbf09 Panagiotis Kanavos
        /// </summary>
184 d78cbf09 Panagiotis Kanavos
        /// <param name="clsid">The CLSID of the component.</param>
185 d78cbf09 Panagiotis Kanavos
        /// <param name="fileType">
186 d78cbf09 Panagiotis Kanavos
        /// The file type that the context menu handler is associated with. For 
187 d78cbf09 Panagiotis Kanavos
        /// example, '*' means all file types; '.txt' means all .txt files. The 
188 d78cbf09 Panagiotis Kanavos
        /// parameter must not be NULL or an empty string. 
189 d78cbf09 Panagiotis Kanavos
        /// </param>
190 d78cbf09 Panagiotis Kanavos
        /// <param name="friendlyName">The friendly name of the component.</param>
191 d78cbf09 Panagiotis Kanavos
        public static void RegisterShellExtContextMenuHandler(Guid clsid,
192 d78cbf09 Panagiotis Kanavos
            string fileType, string friendlyName)
193 d78cbf09 Panagiotis Kanavos
        {
194 d78cbf09 Panagiotis Kanavos
            if (clsid == Guid.Empty)
195 d78cbf09 Panagiotis Kanavos
            {
196 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("clsid must not be empty");
197 d78cbf09 Panagiotis Kanavos
            }
198 d78cbf09 Panagiotis Kanavos
            if (string.IsNullOrEmpty(fileType))
199 d78cbf09 Panagiotis Kanavos
            {
200 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("fileType must not be null or empty");
201 d78cbf09 Panagiotis Kanavos
            }
202 d78cbf09 Panagiotis Kanavos
203 d78cbf09 Panagiotis Kanavos
            // If fileType starts with '.', try to read the default value of the 
204 d78cbf09 Panagiotis Kanavos
            // HKCR\<File Type> key which contains the ProgID to which the file type 
205 d78cbf09 Panagiotis Kanavos
            // is linked.
206 d78cbf09 Panagiotis Kanavos
            if (fileType.StartsWith("."))
207 aba9e6d9 Panagiotis Kanavos
            {                                
208 d78cbf09 Panagiotis Kanavos
                using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(fileType))
209 d78cbf09 Panagiotis Kanavos
                {
210 d78cbf09 Panagiotis Kanavos
                    if (key != null)
211 d78cbf09 Panagiotis Kanavos
                    {
212 d78cbf09 Panagiotis Kanavos
                        // If the key exists and its default value is not empty, use 
213 d78cbf09 Panagiotis Kanavos
                        // the ProgID as the file type.
214 d78cbf09 Panagiotis Kanavos
                        string defaultVal = key.GetValue(null) as string;
215 d78cbf09 Panagiotis Kanavos
                        if (!string.IsNullOrEmpty(defaultVal))
216 d78cbf09 Panagiotis Kanavos
                        {
217 d78cbf09 Panagiotis Kanavos
                            fileType = defaultVal;
218 d78cbf09 Panagiotis Kanavos
                        }
219 d78cbf09 Panagiotis Kanavos
                    }
220 d78cbf09 Panagiotis Kanavos
                }
221 d78cbf09 Panagiotis Kanavos
            }
222 d78cbf09 Panagiotis Kanavos
223 d78cbf09 Panagiotis Kanavos
            // Create the key HKCR\<File Type>\shellex\ContextMenuHandlers\{<CLSID>}.
224 d78cbf09 Panagiotis Kanavos
            string keyName = string.Format(@"{0}\shellex\ContextMenuHandlers\{1}",
225 d78cbf09 Panagiotis Kanavos
                fileType, friendlyName);
226 d78cbf09 Panagiotis Kanavos
            using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(keyName))
227 d78cbf09 Panagiotis Kanavos
            {
228 d78cbf09 Panagiotis Kanavos
                // Set the default value of the key.
229 d78cbf09 Panagiotis Kanavos
                if (key != null)//&& !string.IsNullOrEmpty(clsid.ToString("B")))
230 d78cbf09 Panagiotis Kanavos
                {
231 d78cbf09 Panagiotis Kanavos
                    key.SetValue(null, clsid.ToString("B"));
232 d78cbf09 Panagiotis Kanavos
                }
233 d78cbf09 Panagiotis Kanavos
            }
234 d78cbf09 Panagiotis Kanavos
        }
235 d78cbf09 Panagiotis Kanavos
236 d78cbf09 Panagiotis Kanavos
        /// <summary>
237 d78cbf09 Panagiotis Kanavos
        /// Unregister the context menu handler.
238 d78cbf09 Panagiotis Kanavos
        /// </summary>
239 d78cbf09 Panagiotis Kanavos
        /// <param name="clsid">The CLSID of the component.</param>
240 d78cbf09 Panagiotis Kanavos
        /// <param name="fileType">
241 d78cbf09 Panagiotis Kanavos
        /// The file type that the context menu handler is associated with. For 
242 d78cbf09 Panagiotis Kanavos
        /// example, '*' means all file types; '.txt' means all .txt files. The 
243 d78cbf09 Panagiotis Kanavos
        /// parameter must not be NULL or an empty string. 
244 d78cbf09 Panagiotis Kanavos
        /// </param>
245 d78cbf09 Panagiotis Kanavos
        public static void UnregisterShellExtContextMenuHandler(Guid clsid,
246 d78cbf09 Panagiotis Kanavos
            string fileType, string friendlyName)
247 d78cbf09 Panagiotis Kanavos
        {
248 d78cbf09 Panagiotis Kanavos
            if (clsid == null)
249 d78cbf09 Panagiotis Kanavos
            {
250 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("clsid must not be null");
251 d78cbf09 Panagiotis Kanavos
            }
252 d78cbf09 Panagiotis Kanavos
            if (string.IsNullOrEmpty(fileType))
253 d78cbf09 Panagiotis Kanavos
            {
254 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("fileType must not be null or empty");
255 d78cbf09 Panagiotis Kanavos
            }
256 d78cbf09 Panagiotis Kanavos
257 d78cbf09 Panagiotis Kanavos
            // If fileType starts with '.', try to read the default value of the 
258 d78cbf09 Panagiotis Kanavos
            // HKCR\<File Type> key which contains the ProgID to which the file type 
259 d78cbf09 Panagiotis Kanavos
            // is linked.
260 d78cbf09 Panagiotis Kanavos
            if (fileType.StartsWith("."))
261 d78cbf09 Panagiotis Kanavos
            {
262 d78cbf09 Panagiotis Kanavos
                using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(fileType))
263 d78cbf09 Panagiotis Kanavos
                {
264 d78cbf09 Panagiotis Kanavos
                    if (key != null)
265 d78cbf09 Panagiotis Kanavos
                    {
266 d78cbf09 Panagiotis Kanavos
                        // If the key exists and its default value is not empty, use 
267 d78cbf09 Panagiotis Kanavos
                        // the ProgID as the file type.
268 d78cbf09 Panagiotis Kanavos
                        string defaultVal = key.GetValue(null) as string;
269 d78cbf09 Panagiotis Kanavos
                        if (!string.IsNullOrEmpty(defaultVal))
270 d78cbf09 Panagiotis Kanavos
                        {
271 d78cbf09 Panagiotis Kanavos
                            fileType = defaultVal;
272 d78cbf09 Panagiotis Kanavos
                        }
273 d78cbf09 Panagiotis Kanavos
                    }
274 d78cbf09 Panagiotis Kanavos
                }
275 d78cbf09 Panagiotis Kanavos
            }
276 d78cbf09 Panagiotis Kanavos
277 d78cbf09 Panagiotis Kanavos
            // Remove the key HKCR\<File Type>\shellex\ContextMenuHandlers\{<CLSID>}.
278 d78cbf09 Panagiotis Kanavos
            string keyName = string.Format(@"{0}\shellex\ContextMenuHandlers\{1}",
279 d78cbf09 Panagiotis Kanavos
                fileType, friendlyName);
280 d78cbf09 Panagiotis Kanavos
            Registry.ClassesRoot.DeleteSubKeyTree(keyName, false);
281 d78cbf09 Panagiotis Kanavos
        }
282 d78cbf09 Panagiotis Kanavos
283 d78cbf09 Panagiotis Kanavos
        public static void MarkApproved(Guid guid, string friendlyName)
284 d78cbf09 Panagiotis Kanavos
        {
285 0eea575a Panagiotis Kanavos
            Debug.WriteLine(String.Format("Marking approved {0} {1}", guid, friendlyName), LogCategories.Shell);
286 d78cbf09 Panagiotis Kanavos
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(_approvedKey))
287 d78cbf09 Panagiotis Kanavos
            {
288 d78cbf09 Panagiotis Kanavos
                // Set the default value of the key.
289 d78cbf09 Panagiotis Kanavos
                if (key != null)//&& !string.IsNullOrEmpty(clsid.ToString("B")))
290 d78cbf09 Panagiotis Kanavos
                {
291 d78cbf09 Panagiotis Kanavos
                    key.SetValue(guid.ToString("B"), friendlyName, RegistryValueKind.String);
292 d78cbf09 Panagiotis Kanavos
                }
293 d78cbf09 Panagiotis Kanavos
                else
294 d78cbf09 Panagiotis Kanavos
                {
295 0eea575a Panagiotis Kanavos
                    Debug.WriteLine("Error - failed to open key " + _approvedKey,LogCategories.Shell);
296 d78cbf09 Panagiotis Kanavos
                }
297 d78cbf09 Panagiotis Kanavos
            }
298 d78cbf09 Panagiotis Kanavos
        }
299 d78cbf09 Panagiotis Kanavos
300 7e26c075 Panagiotis Kanavos
        public static void RemoveApproved(Guid guid)
301 d78cbf09 Panagiotis Kanavos
        {
302 d78cbf09 Panagiotis Kanavos
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(_approvedKey))
303 d78cbf09 Panagiotis Kanavos
            {
304 d78cbf09 Panagiotis Kanavos
                // Set the default value of the key.
305 d78cbf09 Panagiotis Kanavos
                if (key != null)//&& !string.IsNullOrEmpty(clsid.ToString("B")))
306 d78cbf09 Panagiotis Kanavos
                {
307 d78cbf09 Panagiotis Kanavos
                    key.DeleteValue(guid.ToString("B"), false);
308 d78cbf09 Panagiotis Kanavos
                }
309 d78cbf09 Panagiotis Kanavos
                else
310 d78cbf09 Panagiotis Kanavos
                {
311 0eea575a Panagiotis Kanavos
                    Debug.WriteLine("Error - failed to open key " + _approvedKey, LogCategories.Shell);
312 d78cbf09 Panagiotis Kanavos
                }
313 d78cbf09 Panagiotis Kanavos
            }
314 d78cbf09 Panagiotis Kanavos
        }
315 d78cbf09 Panagiotis Kanavos
    }
316 d78cbf09 Panagiotis Kanavos
317 d78cbf09 Panagiotis Kanavos
    #endregion
318 d78cbf09 Panagiotis Kanavos
319 d78cbf09 Panagiotis Kanavos
320 d78cbf09 Panagiotis Kanavos
    #region Enums & Structs
321 d78cbf09 Panagiotis Kanavos
322 d78cbf09 Panagiotis Kanavos
    #region enum HChangeNotifyEventID
323 d78cbf09 Panagiotis Kanavos
    /// <summary>
324 d78cbf09 Panagiotis Kanavos
    /// Describes the event that has occurred. 
325 d78cbf09 Panagiotis Kanavos
    /// Typically, only one event is specified at a time. 
326 d78cbf09 Panagiotis Kanavos
    /// If more than one event is specified, the values contained 
327 d78cbf09 Panagiotis Kanavos
    /// in the <i>dwItem1</i> and <i>dwItem2</i> 
328 d78cbf09 Panagiotis Kanavos
    /// parameters must be the same, respectively, for all specified events. 
329 d78cbf09 Panagiotis Kanavos
    /// This parameter can be one or more of the following values. 
330 d78cbf09 Panagiotis Kanavos
    /// </summary>
331 d78cbf09 Panagiotis Kanavos
    /// <remarks>
332 d78cbf09 Panagiotis Kanavos
    /// <para><b>Windows NT/2000/XP:</b> <i>dwItem2</i> contains the index 
333 d78cbf09 Panagiotis Kanavos
    /// in the system image list that has changed. 
334 d78cbf09 Panagiotis Kanavos
    /// <i>dwItem1</i> is not used and should be <see langword="null"/>.</para>
335 d78cbf09 Panagiotis Kanavos
    /// <para><b>Windows 95/98:</b> <i>dwItem1</i> contains the index 
336 d78cbf09 Panagiotis Kanavos
    /// in the system image list that has changed. 
337 d78cbf09 Panagiotis Kanavos
    /// <i>dwItem2</i> is not used and should be <see langword="null"/>.</para>
338 d78cbf09 Panagiotis Kanavos
    /// </remarks>
339 d78cbf09 Panagiotis Kanavos
    [Flags]
340 d78cbf09 Panagiotis Kanavos
    enum HChangeNotifyEventID
341 d78cbf09 Panagiotis Kanavos
    {
342 d78cbf09 Panagiotis Kanavos
        /// <summary>
343 d78cbf09 Panagiotis Kanavos
        /// All events have occurred. 
344 d78cbf09 Panagiotis Kanavos
        /// </summary>
345 d78cbf09 Panagiotis Kanavos
        SHCNE_ALLEVENTS = 0x7FFFFFFF,
346 d78cbf09 Panagiotis Kanavos
347 d78cbf09 Panagiotis Kanavos
        /// <summary>
348 d78cbf09 Panagiotis Kanavos
        /// A file type association has changed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> 
349 d78cbf09 Panagiotis Kanavos
        /// must be specified in the <i>uFlags</i> parameter. 
350 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> and <i>dwItem2</i> are not used and must be <see langword="null"/>. 
351 d78cbf09 Panagiotis Kanavos
        /// </summary>
352 d78cbf09 Panagiotis Kanavos
        SHCNE_ASSOCCHANGED = 0x08000000,
353 d78cbf09 Panagiotis Kanavos
354 d78cbf09 Panagiotis Kanavos
        /// <summary>
355 d78cbf09 Panagiotis Kanavos
        /// The attributes of an item or folder have changed. 
356 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
357 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
358 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the item or folder that has changed. 
359 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>.
360 d78cbf09 Panagiotis Kanavos
        /// </summary>
361 d78cbf09 Panagiotis Kanavos
        SHCNE_ATTRIBUTES = 0x00000800,
362 d78cbf09 Panagiotis Kanavos
363 d78cbf09 Panagiotis Kanavos
        /// <summary>
364 d78cbf09 Panagiotis Kanavos
        /// A nonfolder item has been created. 
365 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
366 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
367 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the item that was created. 
368 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>.
369 d78cbf09 Panagiotis Kanavos
        /// </summary>
370 d78cbf09 Panagiotis Kanavos
        SHCNE_CREATE = 0x00000002,
371 d78cbf09 Panagiotis Kanavos
372 d78cbf09 Panagiotis Kanavos
        /// <summary>
373 d78cbf09 Panagiotis Kanavos
        /// A nonfolder item has been deleted. 
374 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
375 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
376 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the item that was deleted. 
377 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
378 d78cbf09 Panagiotis Kanavos
        /// </summary>
379 d78cbf09 Panagiotis Kanavos
        SHCNE_DELETE = 0x00000004,
380 d78cbf09 Panagiotis Kanavos
381 d78cbf09 Panagiotis Kanavos
        /// <summary>
382 d78cbf09 Panagiotis Kanavos
        /// A drive has been added. 
383 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
384 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
385 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the root of the drive that was added. 
386 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
387 d78cbf09 Panagiotis Kanavos
        /// </summary>
388 d78cbf09 Panagiotis Kanavos
        SHCNE_DRIVEADD = 0x00000100,
389 d78cbf09 Panagiotis Kanavos
390 d78cbf09 Panagiotis Kanavos
        /// <summary>
391 d78cbf09 Panagiotis Kanavos
        /// A drive has been added and the Shell should create a new window for the drive. 
392 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
393 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
394 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the root of the drive that was added. 
395 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
396 d78cbf09 Panagiotis Kanavos
        /// </summary>
397 d78cbf09 Panagiotis Kanavos
        SHCNE_DRIVEADDGUI = 0x00010000,
398 d78cbf09 Panagiotis Kanavos
399 d78cbf09 Panagiotis Kanavos
        /// <summary>
400 d78cbf09 Panagiotis Kanavos
        /// A drive has been removed. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
401 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
402 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the root of the drive that was removed.
403 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
404 d78cbf09 Panagiotis Kanavos
        /// </summary>
405 d78cbf09 Panagiotis Kanavos
        SHCNE_DRIVEREMOVED = 0x00000080,
406 d78cbf09 Panagiotis Kanavos
407 d78cbf09 Panagiotis Kanavos
        /// <summary>
408 d78cbf09 Panagiotis Kanavos
        /// Not currently used. 
409 d78cbf09 Panagiotis Kanavos
        /// </summary>
410 d78cbf09 Panagiotis Kanavos
        SHCNE_EXTENDED_EVENT = 0x04000000,
411 d78cbf09 Panagiotis Kanavos
412 d78cbf09 Panagiotis Kanavos
        /// <summary>
413 d78cbf09 Panagiotis Kanavos
        /// The amount of free space on a drive has changed. 
414 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
415 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
416 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the root of the drive on which the free space changed.
417 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
418 d78cbf09 Panagiotis Kanavos
        /// </summary>
419 d78cbf09 Panagiotis Kanavos
        SHCNE_FREESPACE = 0x00040000,
420 d78cbf09 Panagiotis Kanavos
421 d78cbf09 Panagiotis Kanavos
        /// <summary>
422 d78cbf09 Panagiotis Kanavos
        /// Storage media has been inserted into a drive. 
423 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
424 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
425 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the root of the drive that contains the new media. 
426 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
427 d78cbf09 Panagiotis Kanavos
        /// </summary>
428 d78cbf09 Panagiotis Kanavos
        SHCNE_MEDIAINSERTED = 0x00000020,
429 d78cbf09 Panagiotis Kanavos
430 d78cbf09 Panagiotis Kanavos
        /// <summary>
431 d78cbf09 Panagiotis Kanavos
        /// Storage media has been removed from a drive. 
432 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
433 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
434 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the root of the drive from which the media was removed. 
435 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
436 d78cbf09 Panagiotis Kanavos
        /// </summary>
437 d78cbf09 Panagiotis Kanavos
        SHCNE_MEDIAREMOVED = 0x00000040,
438 d78cbf09 Panagiotis Kanavos
439 d78cbf09 Panagiotis Kanavos
        /// <summary>
440 d78cbf09 Panagiotis Kanavos
        /// A folder has been created. <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> 
441 d78cbf09 Panagiotis Kanavos
        /// or <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
442 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the folder that was created. 
443 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
444 d78cbf09 Panagiotis Kanavos
        /// </summary>
445 d78cbf09 Panagiotis Kanavos
        SHCNE_MKDIR = 0x00000008,
446 d78cbf09 Panagiotis Kanavos
447 d78cbf09 Panagiotis Kanavos
        /// <summary>
448 d78cbf09 Panagiotis Kanavos
        /// A folder on the local computer is being shared via the network. 
449 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
450 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
451 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the folder that is being shared. 
452 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
453 d78cbf09 Panagiotis Kanavos
        /// </summary>
454 d78cbf09 Panagiotis Kanavos
        SHCNE_NETSHARE = 0x00000200,
455 d78cbf09 Panagiotis Kanavos
456 d78cbf09 Panagiotis Kanavos
        /// <summary>
457 d78cbf09 Panagiotis Kanavos
        /// A folder on the local computer is no longer being shared via the network. 
458 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
459 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
460 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the folder that is no longer being shared. 
461 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
462 d78cbf09 Panagiotis Kanavos
        /// </summary>
463 d78cbf09 Panagiotis Kanavos
        SHCNE_NETUNSHARE = 0x00000400,
464 d78cbf09 Panagiotis Kanavos
465 d78cbf09 Panagiotis Kanavos
        /// <summary>
466 d78cbf09 Panagiotis Kanavos
        /// The name of a folder has changed. 
467 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
468 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
469 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the previous pointer to an item identifier list (PIDL) or name of the folder. 
470 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> contains the new PIDL or name of the folder. 
471 d78cbf09 Panagiotis Kanavos
        /// </summary>
472 d78cbf09 Panagiotis Kanavos
        SHCNE_RENAMEFOLDER = 0x00020000,
473 d78cbf09 Panagiotis Kanavos
474 d78cbf09 Panagiotis Kanavos
        /// <summary>
475 d78cbf09 Panagiotis Kanavos
        /// The name of a nonfolder item has changed. 
476 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
477 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
478 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the previous PIDL or name of the item. 
479 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> contains the new PIDL or name of the item. 
480 d78cbf09 Panagiotis Kanavos
        /// </summary>
481 d78cbf09 Panagiotis Kanavos
        SHCNE_RENAMEITEM = 0x00000001,
482 d78cbf09 Panagiotis Kanavos
483 d78cbf09 Panagiotis Kanavos
        /// <summary>
484 d78cbf09 Panagiotis Kanavos
        /// A folder has been removed. 
485 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
486 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
487 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the folder that was removed. 
488 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
489 d78cbf09 Panagiotis Kanavos
        /// </summary>
490 d78cbf09 Panagiotis Kanavos
        SHCNE_RMDIR = 0x00000010,
491 d78cbf09 Panagiotis Kanavos
492 d78cbf09 Panagiotis Kanavos
        /// <summary>
493 d78cbf09 Panagiotis Kanavos
        /// The computer has disconnected from a server. 
494 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
495 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
496 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the server from which the computer was disconnected. 
497 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
498 d78cbf09 Panagiotis Kanavos
        /// </summary>
499 d78cbf09 Panagiotis Kanavos
        SHCNE_SERVERDISCONNECT = 0x00004000,
500 d78cbf09 Panagiotis Kanavos
501 d78cbf09 Panagiotis Kanavos
        /// <summary>
502 d78cbf09 Panagiotis Kanavos
        /// The contents of an existing folder have changed, 
503 d78cbf09 Panagiotis Kanavos
        /// but the folder still exists and has not been renamed. 
504 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_IDLIST"/> or 
505 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_PATH"/> must be specified in <i>uFlags</i>. 
506 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> contains the folder that has changed. 
507 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem2</i> is not used and should be <see langword="null"/>. 
508 d78cbf09 Panagiotis Kanavos
        /// If a folder has been created, deleted, or renamed, use SHCNE_MKDIR, SHCNE_RMDIR, or 
509 d78cbf09 Panagiotis Kanavos
        /// SHCNE_RENAMEFOLDER, respectively, instead. 
510 d78cbf09 Panagiotis Kanavos
        /// </summary>
511 d78cbf09 Panagiotis Kanavos
        SHCNE_UPDATEDIR = 0x00001000,
512 d78cbf09 Panagiotis Kanavos
513 d78cbf09 Panagiotis Kanavos
        /// <summary>
514 d78cbf09 Panagiotis Kanavos
        /// An image in the system image list has changed. 
515 d78cbf09 Panagiotis Kanavos
        /// <see cref="HChangeNotifyFlags.SHCNF_DWORD"/> must be specified in <i>uFlags</i>. 
516 d78cbf09 Panagiotis Kanavos
        /// </summary>
517 d78cbf09 Panagiotis Kanavos
        SHCNE_UPDATEIMAGE = 0x00008000,
518 d78cbf09 Panagiotis Kanavos
519 d78cbf09 Panagiotis Kanavos
    }
520 d78cbf09 Panagiotis Kanavos
    #endregion // enum HChangeNotifyEventID
521 d78cbf09 Panagiotis Kanavos
522 d78cbf09 Panagiotis Kanavos
    #region public enum HChangeNotifyFlags
523 d78cbf09 Panagiotis Kanavos
    /// <summary>
524 d78cbf09 Panagiotis Kanavos
    /// Flags that indicate the meaning of the <i>dwItem1</i> and <i>dwItem2</i> parameters. 
525 d78cbf09 Panagiotis Kanavos
    /// The uFlags parameter must be one of the following values.
526 d78cbf09 Panagiotis Kanavos
    /// </summary>
527 d78cbf09 Panagiotis Kanavos
    [Flags]
528 d78cbf09 Panagiotis Kanavos
    public enum HChangeNotifyFlags
529 d78cbf09 Panagiotis Kanavos
    {
530 d78cbf09 Panagiotis Kanavos
        /// <summary>
531 d78cbf09 Panagiotis Kanavos
        /// The <i>dwItem1</i> and <i>dwItem2</i> parameters are DWORD values. 
532 d78cbf09 Panagiotis Kanavos
        /// </summary>
533 d78cbf09 Panagiotis Kanavos
        SHCNF_DWORD = 0x0003,
534 d78cbf09 Panagiotis Kanavos
        /// <summary>
535 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of ITEMIDLIST structures that 
536 d78cbf09 Panagiotis Kanavos
        /// represent the item(s) affected by the change. 
537 d78cbf09 Panagiotis Kanavos
        /// Each ITEMIDLIST must be relative to the desktop folder. 
538 d78cbf09 Panagiotis Kanavos
        /// </summary>
539 d78cbf09 Panagiotis Kanavos
        SHCNF_IDLIST = 0x0000,
540 d78cbf09 Panagiotis Kanavos
        /// <summary>
541 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of 
542 d78cbf09 Panagiotis Kanavos
        /// maximum length MAX_PATH that contain the full path names 
543 d78cbf09 Panagiotis Kanavos
        /// of the items affected by the change. 
544 d78cbf09 Panagiotis Kanavos
        /// </summary>
545 d78cbf09 Panagiotis Kanavos
        SHCNF_PATHA = 0x0001,
546 d78cbf09 Panagiotis Kanavos
        /// <summary>
547 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings of 
548 d78cbf09 Panagiotis Kanavos
        /// maximum length MAX_PATH that contain the full path names 
549 d78cbf09 Panagiotis Kanavos
        /// of the items affected by the change. 
550 d78cbf09 Panagiotis Kanavos
        /// </summary>
551 d78cbf09 Panagiotis Kanavos
        SHCNF_PATHW = 0x0005,
552 d78cbf09 Panagiotis Kanavos
        /// <summary>
553 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that 
554 d78cbf09 Panagiotis Kanavos
        /// represent the friendly names of the printer(s) affected by the change. 
555 d78cbf09 Panagiotis Kanavos
        /// </summary>
556 d78cbf09 Panagiotis Kanavos
        SHCNF_PRINTERA = 0x0002,
557 d78cbf09 Panagiotis Kanavos
        /// <summary>
558 d78cbf09 Panagiotis Kanavos
        /// <i>dwItem1</i> and <i>dwItem2</i> are the addresses of null-terminated strings that 
559 d78cbf09 Panagiotis Kanavos
        /// represent the friendly names of the printer(s) affected by the change. 
560 d78cbf09 Panagiotis Kanavos
        /// </summary>
561 d78cbf09 Panagiotis Kanavos
        SHCNF_PRINTERW = 0x0006,
562 d78cbf09 Panagiotis Kanavos
        /// <summary>
563 d78cbf09 Panagiotis Kanavos
        /// The function should not return until the notification 
564 d78cbf09 Panagiotis Kanavos
        /// has been delivered to all affected components. 
565 d78cbf09 Panagiotis Kanavos
        /// As this flag modifies other data-type flags, it cannot by used by itself.
566 d78cbf09 Panagiotis Kanavos
        /// </summary>
567 d78cbf09 Panagiotis Kanavos
        SHCNF_FLUSH = 0x1000,
568 d78cbf09 Panagiotis Kanavos
        /// <summary>
569 d78cbf09 Panagiotis Kanavos
        /// The function should begin delivering notifications to all affected components 
570 d78cbf09 Panagiotis Kanavos
        /// but should return as soon as the notification process has begun. 
571 d78cbf09 Panagiotis Kanavos
        /// As this flag modifies other data-type flags, it cannot by used by itself.
572 d78cbf09 Panagiotis Kanavos
        /// </summary>
573 d78cbf09 Panagiotis Kanavos
        SHCNF_FLUSHNOWAIT = 0x2000
574 d78cbf09 Panagiotis Kanavos
    }
575 d78cbf09 Panagiotis Kanavos
    #endregion // enum HChangeNotifyFlags
576 d78cbf09 Panagiotis Kanavos
577 d78cbf09 Panagiotis Kanavos
    internal enum GCS : uint
578 d78cbf09 Panagiotis Kanavos
    {
579 d78cbf09 Panagiotis Kanavos
        GCS_VERBA = 0x00000000,
580 d78cbf09 Panagiotis Kanavos
        GCS_HELPTEXTA = 0x00000001,
581 d78cbf09 Panagiotis Kanavos
        GCS_VALIDATEA = 0x00000002,
582 d78cbf09 Panagiotis Kanavos
        GCS_VERBW = 0x00000004,
583 d78cbf09 Panagiotis Kanavos
        GCS_HELPTEXTW = 0x00000005,
584 d78cbf09 Panagiotis Kanavos
        GCS_VALIDATEW = 0x00000006,
585 d78cbf09 Panagiotis Kanavos
        GCS_VERBICONW = 0x00000014,
586 d78cbf09 Panagiotis Kanavos
        GCS_UNICODE = 0x00000004
587 d78cbf09 Panagiotis Kanavos
    }
588 d78cbf09 Panagiotis Kanavos
589 d78cbf09 Panagiotis Kanavos
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
590 d78cbf09 Panagiotis Kanavos
    internal struct CMINVOKECOMMANDINFO
591 d78cbf09 Panagiotis Kanavos
    {
592 d78cbf09 Panagiotis Kanavos
        public uint cbSize;
593 d78cbf09 Panagiotis Kanavos
        public CMIC fMask;
594 d78cbf09 Panagiotis Kanavos
        public IntPtr hwnd;
595 d78cbf09 Panagiotis Kanavos
        public IntPtr verb;
596 d78cbf09 Panagiotis Kanavos
        [MarshalAs(UnmanagedType.LPStr)]
597 d78cbf09 Panagiotis Kanavos
        public string parameters;
598 d78cbf09 Panagiotis Kanavos
        [MarshalAs(UnmanagedType.LPStr)]
599 d78cbf09 Panagiotis Kanavos
        public string directory;
600 d78cbf09 Panagiotis Kanavos
        public int nShow;
601 d78cbf09 Panagiotis Kanavos
        public uint dwHotKey;
602 d78cbf09 Panagiotis Kanavos
        public IntPtr hIcon;
603 d78cbf09 Panagiotis Kanavos
    }
604 d78cbf09 Panagiotis Kanavos
605 d78cbf09 Panagiotis Kanavos
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
606 d78cbf09 Panagiotis Kanavos
    internal struct CMINVOKECOMMANDINFOEX
607 d78cbf09 Panagiotis Kanavos
    {
608 d78cbf09 Panagiotis Kanavos
        public uint cbSize;
609 d78cbf09 Panagiotis Kanavos
        public CMIC fMask;
610 d78cbf09 Panagiotis Kanavos
        public IntPtr hwnd;
611 d78cbf09 Panagiotis Kanavos
        public IntPtr verb;
612 d78cbf09 Panagiotis Kanavos
        [MarshalAs(UnmanagedType.LPStr)]
613 d78cbf09 Panagiotis Kanavos
        public string parameters;
614 d78cbf09 Panagiotis Kanavos
        [MarshalAs(UnmanagedType.LPStr)]
615 d78cbf09 Panagiotis Kanavos
        public string directory;
616 d78cbf09 Panagiotis Kanavos
        public int nShow;
617 d78cbf09 Panagiotis Kanavos
        public uint dwHotKey;
618 d78cbf09 Panagiotis Kanavos
        public IntPtr hIcon;
619 d78cbf09 Panagiotis Kanavos
        [MarshalAs(UnmanagedType.LPStr)]
620 d78cbf09 Panagiotis Kanavos
        public string title;
621 d78cbf09 Panagiotis Kanavos
        public IntPtr verbW;
622 d78cbf09 Panagiotis Kanavos
        public string parametersW;
623 d78cbf09 Panagiotis Kanavos
        public string directoryW;
624 d78cbf09 Panagiotis Kanavos
        public string titleW;
625 d78cbf09 Panagiotis Kanavos
        POINT ptInvoke;
626 d78cbf09 Panagiotis Kanavos
    }
627 d78cbf09 Panagiotis Kanavos
628 d78cbf09 Panagiotis Kanavos
    [Flags]
629 d78cbf09 Panagiotis Kanavos
    internal enum CMIC : uint
630 d78cbf09 Panagiotis Kanavos
    {
631 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_ICON = 0x00000010,
632 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_HOTKEY = 0x00000020,
633 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_NOASYNC = 0x00000100,
634 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_FLAG_NO_UI = 0x00000400,
635 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_UNICODE = 0x00004000,
636 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_NO_CONSOLE = 0x00008000,
637 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_ASYNCOK = 0x00100000,
638 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_NOZONECHECKS = 0x00800000,
639 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_FLAG_LOG_USAGE = 0x04000000,
640 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_SHIFT_DOWN = 0x10000000,
641 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_PTINVOKE = 0x20000000,
642 d78cbf09 Panagiotis Kanavos
        CMIC_MASK_CONTROL_DOWN = 0x40000000
643 d78cbf09 Panagiotis Kanavos
    }
644 d78cbf09 Panagiotis Kanavos
645 d78cbf09 Panagiotis Kanavos
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
646 d78cbf09 Panagiotis Kanavos
    public struct POINT
647 d78cbf09 Panagiotis Kanavos
    {
648 d78cbf09 Panagiotis Kanavos
        public int X;
649 d78cbf09 Panagiotis Kanavos
        public int Y;
650 d78cbf09 Panagiotis Kanavos
    }
651 d78cbf09 Panagiotis Kanavos
652 d78cbf09 Panagiotis Kanavos
    internal enum CLIPFORMAT : uint
653 d78cbf09 Panagiotis Kanavos
    {
654 d78cbf09 Panagiotis Kanavos
        CF_TEXT = 1,
655 d78cbf09 Panagiotis Kanavos
        CF_BITMAP = 2,
656 d78cbf09 Panagiotis Kanavos
        CF_METAFILEPICT = 3,
657 d78cbf09 Panagiotis Kanavos
        CF_SYLK = 4,
658 d78cbf09 Panagiotis Kanavos
        CF_DIF = 5,
659 d78cbf09 Panagiotis Kanavos
        CF_TIFF = 6,
660 d78cbf09 Panagiotis Kanavos
        CF_OEMTEXT = 7,
661 d78cbf09 Panagiotis Kanavos
        CF_DIB = 8,
662 d78cbf09 Panagiotis Kanavos
        CF_PALETTE = 9,
663 d78cbf09 Panagiotis Kanavos
        CF_PENDATA = 10,
664 d78cbf09 Panagiotis Kanavos
        CF_RIFF = 11,
665 d78cbf09 Panagiotis Kanavos
        CF_WAVE = 12,
666 d78cbf09 Panagiotis Kanavos
        CF_UNICODETEXT = 13,
667 d78cbf09 Panagiotis Kanavos
        CF_ENHMETAFILE = 14,
668 d78cbf09 Panagiotis Kanavos
        CF_HDROP = 15,
669 d78cbf09 Panagiotis Kanavos
        CF_LOCALE = 16,
670 d78cbf09 Panagiotis Kanavos
        CF_MAX = 17,
671 d78cbf09 Panagiotis Kanavos
672 d78cbf09 Panagiotis Kanavos
        CF_OWNERDISPLAY = 0x0080,
673 d78cbf09 Panagiotis Kanavos
        CF_DSPTEXT = 0x0081,
674 d78cbf09 Panagiotis Kanavos
        CF_DSPBITMAP = 0x0082,
675 d78cbf09 Panagiotis Kanavos
        CF_DSPMETAFILEPICT = 0x0083,
676 d78cbf09 Panagiotis Kanavos
        CF_DSPENHMETAFILE = 0x008E,
677 d78cbf09 Panagiotis Kanavos
678 d78cbf09 Panagiotis Kanavos
        CF_PRIVATEFIRST = 0x0200,
679 d78cbf09 Panagiotis Kanavos
        CF_PRIVATELAST = 0x02FF,
680 d78cbf09 Panagiotis Kanavos
681 d78cbf09 Panagiotis Kanavos
        CF_GDIOBJFIRST = 0x0300,
682 d78cbf09 Panagiotis Kanavos
        CF_GDIOBJLAST = 0x03FF
683 d78cbf09 Panagiotis Kanavos
    }
684 d78cbf09 Panagiotis Kanavos
685 d78cbf09 Panagiotis Kanavos
    [Flags]
686 d78cbf09 Panagiotis Kanavos
    internal enum CMF : uint
687 d78cbf09 Panagiotis Kanavos
    {
688 d78cbf09 Panagiotis Kanavos
        CMF_NORMAL = 0x00000000,
689 d78cbf09 Panagiotis Kanavos
        CMF_DEFAULTONLY = 0x00000001,
690 d78cbf09 Panagiotis Kanavos
        CMF_VERBSONLY = 0x00000002,
691 d78cbf09 Panagiotis Kanavos
        CMF_EXPLORE = 0x00000004,
692 d78cbf09 Panagiotis Kanavos
        CMF_NOVERBS = 0x00000008,
693 d78cbf09 Panagiotis Kanavos
        CMF_CANRENAME = 0x00000010,
694 d78cbf09 Panagiotis Kanavos
        CMF_NODEFAULT = 0x00000020,
695 d78cbf09 Panagiotis Kanavos
        CMF_INCLUDESTATIC = 0x00000040,
696 d78cbf09 Panagiotis Kanavos
        CMF_ITEMMENU = 0x00000080,
697 d78cbf09 Panagiotis Kanavos
        CMF_EXTENDEDVERBS = 0x00000100,
698 d78cbf09 Panagiotis Kanavos
        CMF_DISABLEDVERBS = 0x00000200,
699 d78cbf09 Panagiotis Kanavos
        CMF_ASYNCVERBSTATE = 0x00000400,
700 d78cbf09 Panagiotis Kanavos
        CMF_OPTIMIZEFORINVOKE = 0x00000800,
701 d78cbf09 Panagiotis Kanavos
        CMF_SYNCCASCADEMENU = 0x00001000,
702 d78cbf09 Panagiotis Kanavos
        CMF_DONOTPICKDEFAULT = 0x00002000,
703 d78cbf09 Panagiotis Kanavos
        CMF_RESERVED = 0xFFFF0000
704 d78cbf09 Panagiotis Kanavos
    }
705 d78cbf09 Panagiotis Kanavos
706 d78cbf09 Panagiotis Kanavos
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
707 d78cbf09 Panagiotis Kanavos
    internal struct MENUITEMINFO
708 d78cbf09 Panagiotis Kanavos
    {
709 d78cbf09 Panagiotis Kanavos
        public uint cbSize;
710 d78cbf09 Panagiotis Kanavos
        public MIIM fMask;
711 d78cbf09 Panagiotis Kanavos
        public MFT fType;
712 d78cbf09 Panagiotis Kanavos
        public MFS fState;
713 d78cbf09 Panagiotis Kanavos
        public uint wID;
714 d78cbf09 Panagiotis Kanavos
        public IntPtr hSubMenu;
715 d78cbf09 Panagiotis Kanavos
        public IntPtr hbmpChecked;
716 d78cbf09 Panagiotis Kanavos
        public IntPtr hbmpUnchecked;
717 d78cbf09 Panagiotis Kanavos
        public UIntPtr dwItemData;
718 d78cbf09 Panagiotis Kanavos
        public string dwTypeData;
719 d78cbf09 Panagiotis Kanavos
        public uint cch;
720 d78cbf09 Panagiotis Kanavos
        public IntPtr hbmpItem;
721 d78cbf09 Panagiotis Kanavos
    }
722 d78cbf09 Panagiotis Kanavos
723 d78cbf09 Panagiotis Kanavos
    [Flags]
724 d78cbf09 Panagiotis Kanavos
    internal enum MIIM : uint
725 d78cbf09 Panagiotis Kanavos
    {
726 d78cbf09 Panagiotis Kanavos
        MIIM_STATE = 0x00000001,
727 d78cbf09 Panagiotis Kanavos
        MIIM_ID = 0x00000002,
728 d78cbf09 Panagiotis Kanavos
        MIIM_SUBMENU = 0x00000004,
729 d78cbf09 Panagiotis Kanavos
        MIIM_CHECKMARKS = 0x00000008,
730 d78cbf09 Panagiotis Kanavos
        MIIM_TYPE = 0x00000010,
731 d78cbf09 Panagiotis Kanavos
        MIIM_DATA = 0x00000020,
732 d78cbf09 Panagiotis Kanavos
        MIIM_STRING = 0x00000040,
733 d78cbf09 Panagiotis Kanavos
        MIIM_BITMAP = 0x00000080,
734 d78cbf09 Panagiotis Kanavos
        MIIM_FTYPE = 0x00000100
735 d78cbf09 Panagiotis Kanavos
    }
736 4d301e8e Panagiotis Kanavos
    [Flags]
737 d78cbf09 Panagiotis Kanavos
    internal enum MFT : uint
738 d78cbf09 Panagiotis Kanavos
    {
739 d78cbf09 Panagiotis Kanavos
        MFT_STRING = 0x00000000,
740 d78cbf09 Panagiotis Kanavos
        MFT_BITMAP = 0x00000004,
741 d78cbf09 Panagiotis Kanavos
        MFT_MENUBARBREAK = 0x00000020,
742 d78cbf09 Panagiotis Kanavos
        MFT_MENUBREAK = 0x00000040,
743 d78cbf09 Panagiotis Kanavos
        MFT_OWNERDRAW = 0x00000100,
744 d78cbf09 Panagiotis Kanavos
        MFT_RADIOCHECK = 0x00000200,
745 d78cbf09 Panagiotis Kanavos
        MFT_SEPARATOR = 0x00000800,
746 d78cbf09 Panagiotis Kanavos
        MFT_RIGHTORDER = 0x00002000,
747 d78cbf09 Panagiotis Kanavos
        MFT_RIGHTJUSTIFY = 0x00004000
748 d78cbf09 Panagiotis Kanavos
    }
749 d78cbf09 Panagiotis Kanavos
750 4d301e8e Panagiotis Kanavos
    [Flags]
751 d78cbf09 Panagiotis Kanavos
    internal enum MFS : uint
752 d78cbf09 Panagiotis Kanavos
    {
753 d78cbf09 Panagiotis Kanavos
        MFS_ENABLED = 0x00000000,
754 d78cbf09 Panagiotis Kanavos
        MFS_UNCHECKED = 0x00000000,
755 d78cbf09 Panagiotis Kanavos
        MFS_UNHILITE = 0x00000000,
756 d78cbf09 Panagiotis Kanavos
        MFS_GRAYED = 0x00000003,
757 d78cbf09 Panagiotis Kanavos
        MFS_DISABLED = 0x00000003,
758 d78cbf09 Panagiotis Kanavos
        MFS_CHECKED = 0x00000008,
759 d78cbf09 Panagiotis Kanavos
        MFS_HILITE = 0x00000080,
760 d78cbf09 Panagiotis Kanavos
        MFS_DEFAULT = 0x00001000
761 d78cbf09 Panagiotis Kanavos
    }
762 d78cbf09 Panagiotis Kanavos
763 4d301e8e Panagiotis Kanavos
    [Flags]
764 4d301e8e Panagiotis Kanavos
    internal enum MF: uint
765 4d301e8e Panagiotis Kanavos
    {
766 4d301e8e Panagiotis Kanavos
        MF_BYCOMMAND    =   0x00000000,
767 4d301e8e Panagiotis Kanavos
        MF_ENABLED      =   0x00000000,
768 4d301e8e Panagiotis Kanavos
        MF_DISABLED     =   0x00000002,
769 4d301e8e Panagiotis Kanavos
        MF_BITMAP       =   0x00000004,
770 4d301e8e Panagiotis Kanavos
        MF_CHECKED      =   0x00000008,
771 4d301e8e Panagiotis Kanavos
        MF_BYPOSITION   =   0x00000400,
772 4d301e8e Panagiotis Kanavos
        MF_SEPARATOR    =   0x00000800
773 4d301e8e Panagiotis Kanavos
    }
774 4d301e8e Panagiotis Kanavos
775 d78cbf09 Panagiotis Kanavos
    #endregion
776 d78cbf09 Panagiotis Kanavos
777 d78cbf09 Panagiotis Kanavos
778 d78cbf09 Panagiotis Kanavos
    internal class NativeMethods
779 d78cbf09 Panagiotis Kanavos
    {
780 d78cbf09 Panagiotis Kanavos
        /// <summary>
781 d78cbf09 Panagiotis Kanavos
        /// Retrieve the names of dropped files that result from a successful drag-
782 d78cbf09 Panagiotis Kanavos
        /// and-drop operation.
783 d78cbf09 Panagiotis Kanavos
        /// </summary>
784 d78cbf09 Panagiotis Kanavos
        /// <param name="hDrop">
785 d78cbf09 Panagiotis Kanavos
        /// Identifier of the structure that contains the file names of the dropped 
786 d78cbf09 Panagiotis Kanavos
        /// files.
787 d78cbf09 Panagiotis Kanavos
        /// </param>
788 d78cbf09 Panagiotis Kanavos
        /// <param name="iFile">
789 d78cbf09 Panagiotis Kanavos
        /// Index of the file to query. If the value of this parameter is 0xFFFFFFFF, 
790 d78cbf09 Panagiotis Kanavos
        /// DragQueryFile returns a count of the files dropped. 
791 d78cbf09 Panagiotis Kanavos
        /// </param>
792 d78cbf09 Panagiotis Kanavos
        /// <param name="pszFile">
793 d78cbf09 Panagiotis Kanavos
        /// The address of a buffer that receives the file name of a dropped file 
794 d78cbf09 Panagiotis Kanavos
        /// when the function returns.
795 d78cbf09 Panagiotis Kanavos
        /// </param>
796 d78cbf09 Panagiotis Kanavos
        /// <param name="cch">
797 d78cbf09 Panagiotis Kanavos
        /// The size, in characters, of the pszFile buffer.
798 d78cbf09 Panagiotis Kanavos
        /// </param>
799 d78cbf09 Panagiotis Kanavos
        /// <returns>A non-zero value indicates a successful call.</returns>
800 d78cbf09 Panagiotis Kanavos
        [DllImport("shell32", CharSet = CharSet.Unicode)]
801 d78cbf09 Panagiotis Kanavos
        public static extern uint DragQueryFile(
802 d78cbf09 Panagiotis Kanavos
            IntPtr hDrop,
803 d78cbf09 Panagiotis Kanavos
            uint iFile,
804 d78cbf09 Panagiotis Kanavos
            StringBuilder pszFile,
805 d78cbf09 Panagiotis Kanavos
            int cch);
806 d78cbf09 Panagiotis Kanavos
807 d78cbf09 Panagiotis Kanavos
        /// <summary>
808 d78cbf09 Panagiotis Kanavos
        /// Free the specified storage medium.
809 d78cbf09 Panagiotis Kanavos
        /// </summary>
810 d78cbf09 Panagiotis Kanavos
        /// <param name="pmedium">
811 d78cbf09 Panagiotis Kanavos
        /// Reference of the storage medium that is to be freed.
812 d78cbf09 Panagiotis Kanavos
        /// </param>
813 d78cbf09 Panagiotis Kanavos
        [DllImport("ole32.dll", CharSet = CharSet.Unicode)]
814 d78cbf09 Panagiotis Kanavos
        public static extern void ReleaseStgMedium(ref STGMEDIUM pmedium);
815 d78cbf09 Panagiotis Kanavos
816 d78cbf09 Panagiotis Kanavos
        /// <summary>
817 d78cbf09 Panagiotis Kanavos
        /// Insert a new menu item at the specified position in a menu.
818 d78cbf09 Panagiotis Kanavos
        /// </summary>
819 d78cbf09 Panagiotis Kanavos
        /// <param name="hMenu">
820 d78cbf09 Panagiotis Kanavos
        /// A handle to the menu in which the new menu item is inserted. 
821 d78cbf09 Panagiotis Kanavos
        /// </param>
822 d78cbf09 Panagiotis Kanavos
        /// <param name="uItem">
823 d78cbf09 Panagiotis Kanavos
        /// The identifier or position of the menu item before which to insert the 
824 d78cbf09 Panagiotis Kanavos
        /// new item. The meaning of this parameter depends on the value of 
825 d78cbf09 Panagiotis Kanavos
        /// fByPosition.
826 d78cbf09 Panagiotis Kanavos
        /// </param>
827 d78cbf09 Panagiotis Kanavos
        /// <param name="fByPosition">
828 d78cbf09 Panagiotis Kanavos
        /// Controls the meaning of uItem. If this parameter is false, uItem is a 
829 d78cbf09 Panagiotis Kanavos
        /// menu item identifier. Otherwise, it is a menu item position. 
830 d78cbf09 Panagiotis Kanavos
        /// </param>
831 d78cbf09 Panagiotis Kanavos
        /// <param name="mii">
832 d78cbf09 Panagiotis Kanavos
        /// A reference of a MENUITEMINFO structure that contains information about 
833 d78cbf09 Panagiotis Kanavos
        /// the new menu item.
834 d78cbf09 Panagiotis Kanavos
        /// </param>
835 d78cbf09 Panagiotis Kanavos
        /// <returns>
836 d78cbf09 Panagiotis Kanavos
        /// If the function succeeds, the return value is true.
837 d78cbf09 Panagiotis Kanavos
        /// </returns>
838 d78cbf09 Panagiotis Kanavos
        [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)]
839 d78cbf09 Panagiotis Kanavos
        [return: MarshalAs(UnmanagedType.Bool)]
840 d78cbf09 Panagiotis Kanavos
        public static extern bool InsertMenuItem(
841 d78cbf09 Panagiotis Kanavos
            IntPtr hMenu,
842 d78cbf09 Panagiotis Kanavos
            uint uItem,
843 d78cbf09 Panagiotis Kanavos
            [MarshalAs(UnmanagedType.Bool)]bool fByPosition,
844 d78cbf09 Panagiotis Kanavos
            ref MENUITEMINFO mii);
845 4d301e8e Panagiotis Kanavos
        
846 4d301e8e Panagiotis Kanavos
        [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)]
847 4d301e8e Panagiotis Kanavos
        [return: MarshalAs(UnmanagedType.Bool)]
848 4d301e8e Panagiotis Kanavos
        public static extern bool InsertMenu(
849 4d301e8e Panagiotis Kanavos
            IntPtr hMenu,
850 4d301e8e Panagiotis Kanavos
            uint uPosition,
851 4d301e8e Panagiotis Kanavos
            MF uFlags,
852 4d301e8e Panagiotis Kanavos
            uint uIDNewItem,
853 4d301e8e Panagiotis Kanavos
            string lpNewItem);
854 4d301e8e Panagiotis Kanavos
855 d78cbf09 Panagiotis Kanavos
856 d78cbf09 Panagiotis Kanavos
        [DllImport("shell32", CharSet = CharSet.Unicode, SetLastError = true)]
857 d78cbf09 Panagiotis Kanavos
        [return: MarshalAs(UnmanagedType.Bool)]
858 d78cbf09 Panagiotis Kanavos
        public static extern bool SHGetPathFromIDList(
859 d78cbf09 Panagiotis Kanavos
            IntPtr pidl,
860 d78cbf09 Panagiotis Kanavos
            StringBuilder pszpath);
861 d78cbf09 Panagiotis Kanavos
862 d78cbf09 Panagiotis Kanavos
        [DllImport("shell32.dll")]
863 d78cbf09 Panagiotis Kanavos
        public static extern void SHChangeNotify(HChangeNotifyEventID wEventId,
864 d78cbf09 Panagiotis Kanavos
                                           HChangeNotifyFlags uFlags,
865 d78cbf09 Panagiotis Kanavos
                                           IntPtr dwItem1,
866 d78cbf09 Panagiotis Kanavos
                                           IntPtr dwItem2);
867 d78cbf09 Panagiotis Kanavos
868 5bcf6d70 Panagiotis Kanavos
        [DllImport("gdi32.dll")]
869 5bcf6d70 Panagiotis Kanavos
        public static extern bool DeleteObject(IntPtr hObject);
870 5bcf6d70 Panagiotis Kanavos
871 5bcf6d70 Panagiotis Kanavos
872 5bcf6d70 Panagiotis Kanavos
873 d78cbf09 Panagiotis Kanavos
        public static int HighWord(int number)
874 d78cbf09 Panagiotis Kanavos
        {
875 d78cbf09 Panagiotis Kanavos
            return ((number & 0x80000000) == 0x80000000) ?
876 d78cbf09 Panagiotis Kanavos
                (number >> 16) : ((number >> 16) & 0xffff);
877 d78cbf09 Panagiotis Kanavos
        }
878 d78cbf09 Panagiotis Kanavos
879 d78cbf09 Panagiotis Kanavos
        public static int LowWord(int number)
880 d78cbf09 Panagiotis Kanavos
        {
881 d78cbf09 Panagiotis Kanavos
            return number & 0xffff;
882 d78cbf09 Panagiotis Kanavos
        }
883 d78cbf09 Panagiotis Kanavos
    }
884 d78cbf09 Panagiotis Kanavos
885 d78cbf09 Panagiotis Kanavos
    internal static class WinError
886 d78cbf09 Panagiotis Kanavos
    {
887 d78cbf09 Panagiotis Kanavos
        public const int S_OK = 0x0000;
888 d78cbf09 Panagiotis Kanavos
        public const int S_FALSE = 0x0001;
889 d78cbf09 Panagiotis Kanavos
        public const int E_FAIL = -2147467259;
890 d78cbf09 Panagiotis Kanavos
        public const int E_INVALIDARG = -2147024809;
891 d78cbf09 Panagiotis Kanavos
        public const int E_OUTOFMEMORY = -2147024882;
892 d78cbf09 Panagiotis Kanavos
        public const int STRSAFE_E_INSUFFICIENT_BUFFER = -2147024774;
893 d78cbf09 Panagiotis Kanavos
894 d78cbf09 Panagiotis Kanavos
        public const uint SEVERITY_SUCCESS = 0;
895 d78cbf09 Panagiotis Kanavos
        public const uint SEVERITY_ERROR = 1;
896 d78cbf09 Panagiotis Kanavos
897 d78cbf09 Panagiotis Kanavos
        /// <summary>
898 d78cbf09 Panagiotis Kanavos
        /// Create an HRESULT value from component pieces.
899 d78cbf09 Panagiotis Kanavos
        /// </summary>
900 d78cbf09 Panagiotis Kanavos
        /// <param name="sev">The severity to be used</param>
901 d78cbf09 Panagiotis Kanavos
        /// <param name="fac">The facility to be used</param>
902 d78cbf09 Panagiotis Kanavos
        /// <param name="code">The error number</param>
903 d78cbf09 Panagiotis Kanavos
        /// <returns>A HRESULT constructed from the above 3 values</returns>
904 d78cbf09 Panagiotis Kanavos
        public static int MAKE_HRESULT(uint sev, uint fac, uint code)
905 d78cbf09 Panagiotis Kanavos
        {
906 d78cbf09 Panagiotis Kanavos
            return (int)((sev << 31) | (fac << 16) | code);
907 d78cbf09 Panagiotis Kanavos
        }
908 d78cbf09 Panagiotis Kanavos
    }
909 d78cbf09 Panagiotis Kanavos
}