root / trunk / Pithos.ShellExtensions / Menus / FileContextMenu.cs @ 5120f3cb
History | View | Annotate | Download (23.9 kB)
1 | d78cbf09 | Panagiotis Kanavos | using System; |
---|---|---|---|
2 | d78cbf09 | Panagiotis Kanavos | using System.Collections.Generic; |
3 | d78cbf09 | Panagiotis Kanavos | using System.ComponentModel.Composition; |
4 | d78cbf09 | Panagiotis Kanavos | using System.Diagnostics; |
5 | d78cbf09 | Panagiotis Kanavos | using System.Diagnostics.Contracts; |
6 | 5bcf6d70 | Panagiotis Kanavos | using System.Drawing; |
7 | d78cbf09 | Panagiotis Kanavos | using System.Linq; |
8 | d78cbf09 | Panagiotis Kanavos | using System.Runtime.InteropServices; |
9 | d78cbf09 | Panagiotis Kanavos | using System.Runtime.InteropServices.ComTypes; |
10 | d78cbf09 | Panagiotis Kanavos | using System.Text; |
11 | 5bcf6d70 | Panagiotis Kanavos | using Pithos.ShellExtensions.Properties; |
12 | d78cbf09 | Panagiotis Kanavos | |
13 | d78cbf09 | Panagiotis Kanavos | namespace Pithos.ShellExtensions.Menus |
14 | d78cbf09 | Panagiotis Kanavos | { |
15 | d78cbf09 | Panagiotis Kanavos | [ClassInterface(ClassInterfaceType.None)] |
16 | d78cbf09 | Panagiotis Kanavos | [Guid("B1F1405D-94A1-4692-B72F-FC8CAF8B8700"), ComVisible(true)] |
17 | d78cbf09 | Panagiotis Kanavos | public class FileContextMenu : IShellExtInit, IContextMenu |
18 | d78cbf09 | Panagiotis Kanavos | { |
19 | d78cbf09 | Panagiotis Kanavos | private const string MenuHandlername = "CSShellExtContextMenuHandler.FileContextMenuExt"; |
20 | d78cbf09 | Panagiotis Kanavos | |
21 | d78cbf09 | Panagiotis Kanavos | |
22 | d78cbf09 | Panagiotis Kanavos | private readonly Dictionary<string, MenuItem> _items; |
23 | d78cbf09 | Panagiotis Kanavos | |
24 | d78cbf09 | Panagiotis Kanavos | |
25 | 5bcf6d70 | Panagiotis Kanavos | [Import] |
26 | 5bcf6d70 | Panagiotis Kanavos | public FileContext Context { get; set; } |
27 | 5bcf6d70 | Panagiotis Kanavos | |
28 | 5bcf6d70 | Panagiotis Kanavos | private IntPtr _gotoBitmap=IntPtr.Zero; |
29 | 5bcf6d70 | Panagiotis Kanavos | private IntPtr _versionBitmap = IntPtr.Zero; |
30 | 7d915c34 | Panagiotis Kanavos | private IntPtr _propertiesBitmap = IntPtr.Zero; |
31 | d78cbf09 | Panagiotis Kanavos | |
32 | d78cbf09 | Panagiotis Kanavos | public FileContextMenu() |
33 | 5bcf6d70 | Panagiotis Kanavos | { |
34 | 4d301e8e | Panagiotis Kanavos | _gotoBitmap = GetBitmapPtr(Resources.MenuGoToPithos); |
35 | 4d301e8e | Panagiotis Kanavos | _versionBitmap = GetBitmapPtr(Resources.MenuHistory); |
36 | 7d915c34 | Panagiotis Kanavos | _propertiesBitmap = GetBitmapPtr(Resources.MenuProperties); |
37 | 5bcf6d70 | Panagiotis Kanavos | |
38 | 5bcf6d70 | Panagiotis Kanavos | |
39 | 5bcf6d70 | Panagiotis Kanavos | |
40 | 5bcf6d70 | Panagiotis Kanavos | |
41 | d78cbf09 | Panagiotis Kanavos | _items = new Dictionary<string, MenuItem>{ |
42 | d78cbf09 | Panagiotis Kanavos | {"gotoPithos",new MenuItem{ |
43 | d78cbf09 | Panagiotis Kanavos | MenuText = "&Go to Pithos", |
44 | d78cbf09 | Panagiotis Kanavos | Verb = "gotoPithos", |
45 | d78cbf09 | Panagiotis Kanavos | VerbCanonicalName = "PITHOSGoTo", |
46 | d78cbf09 | Panagiotis Kanavos | VerbHelpText = "Go to Pithos", |
47 | 4d301e8e | Panagiotis Kanavos | MenuDisplayId = 1, |
48 | 5bcf6d70 | Panagiotis Kanavos | MenuCommand=OnGotoPithos, |
49 | 5bcf6d70 | Panagiotis Kanavos | DisplayFlags=DisplayFlags.All, |
50 | 5bcf6d70 | Panagiotis Kanavos | MenuBitmap = _gotoBitmap |
51 | d78cbf09 | Panagiotis Kanavos | }}, |
52 | 7d915c34 | Panagiotis Kanavos | /*{"showProperties",new MenuItem{ |
53 | 7d915c34 | Panagiotis Kanavos | MenuText = "&Pithos File Properties", |
54 | 7d915c34 | Panagiotis Kanavos | Verb = "showProperties", |
55 | 7d915c34 | Panagiotis Kanavos | VerbCanonicalName = "PITHOSProperties", |
56 | 7d915c34 | Panagiotis Kanavos | VerbHelpText = "Pithos File Properties", |
57 | 7d915c34 | Panagiotis Kanavos | MenuDisplayId = 2, |
58 | 7d915c34 | Panagiotis Kanavos | MenuCommand=OnShowProperties, |
59 | 7d915c34 | Panagiotis Kanavos | DisplayFlags=DisplayFlags.File, |
60 | 7d915c34 | Panagiotis Kanavos | MenuBitmap = _propertiesBitmap |
61 | 7d915c34 | Panagiotis Kanavos | }},*/ |
62 | d78cbf09 | Panagiotis Kanavos | {"prevVersions",new MenuItem{ |
63 | d78cbf09 | Panagiotis Kanavos | MenuText = "&Show Previous Versions", |
64 | d78cbf09 | Panagiotis Kanavos | Verb = "prevVersions", |
65 | d78cbf09 | Panagiotis Kanavos | VerbCanonicalName = "PITHOSPrevVersions", |
66 | d78cbf09 | Panagiotis Kanavos | VerbHelpText = "Go to Pithos and display previous versions", |
67 | 7d915c34 | Panagiotis Kanavos | MenuDisplayId = 3, |
68 | d78cbf09 | Panagiotis Kanavos | MenuCommand=OnVerbDisplayFileName, |
69 | 5bcf6d70 | Panagiotis Kanavos | DisplayFlags=DisplayFlags.File, |
70 | 5bcf6d70 | Panagiotis Kanavos | MenuBitmap=_versionBitmap |
71 | d78cbf09 | Panagiotis Kanavos | }} |
72 | d78cbf09 | Panagiotis Kanavos | }; |
73 | d78cbf09 | Panagiotis Kanavos | |
74 | 5bcf6d70 | Panagiotis Kanavos | IoC.Current.Compose(this); |
75 | 5bcf6d70 | Panagiotis Kanavos | |
76 | 5bcf6d70 | Panagiotis Kanavos | |
77 | 5bcf6d70 | Panagiotis Kanavos | } |
78 | 5bcf6d70 | Panagiotis Kanavos | |
79 | 5bcf6d70 | Panagiotis Kanavos | |
80 | 5bcf6d70 | Panagiotis Kanavos | ~FileContextMenu() |
81 | 5bcf6d70 | Panagiotis Kanavos | { |
82 | 5bcf6d70 | Panagiotis Kanavos | if (_gotoBitmap != IntPtr.Zero) |
83 | 5bcf6d70 | Panagiotis Kanavos | { |
84 | 5bcf6d70 | Panagiotis Kanavos | NativeMethods.DeleteObject(_gotoBitmap); |
85 | 5bcf6d70 | Panagiotis Kanavos | _gotoBitmap= IntPtr.Zero; |
86 | 5bcf6d70 | Panagiotis Kanavos | } |
87 | 5bcf6d70 | Panagiotis Kanavos | if (_versionBitmap != IntPtr.Zero) |
88 | 5bcf6d70 | Panagiotis Kanavos | { |
89 | 5bcf6d70 | Panagiotis Kanavos | NativeMethods.DeleteObject(_versionBitmap); |
90 | 5bcf6d70 | Panagiotis Kanavos | _versionBitmap = IntPtr.Zero; |
91 | 5bcf6d70 | Panagiotis Kanavos | } |
92 | 7d915c34 | Panagiotis Kanavos | if (_propertiesBitmap != IntPtr.Zero) |
93 | 7d915c34 | Panagiotis Kanavos | { |
94 | 7d915c34 | Panagiotis Kanavos | NativeMethods.DeleteObject(_propertiesBitmap); |
95 | 7d915c34 | Panagiotis Kanavos | _propertiesBitmap = IntPtr.Zero; |
96 | 7d915c34 | Panagiotis Kanavos | } |
97 | 5bcf6d70 | Panagiotis Kanavos | |
98 | 5bcf6d70 | Panagiotis Kanavos | } |
99 | 5bcf6d70 | Panagiotis Kanavos | private static IntPtr GetBitmapPtr(Bitmap gotoBitmap) |
100 | 5bcf6d70 | Panagiotis Kanavos | { |
101 | 5bcf6d70 | Panagiotis Kanavos | gotoBitmap.MakeTransparent(gotoBitmap.GetPixel(0, 0)); |
102 | 5bcf6d70 | Panagiotis Kanavos | var hbitmap = gotoBitmap.GetHbitmap(); |
103 | 5bcf6d70 | Panagiotis Kanavos | return hbitmap; |
104 | d78cbf09 | Panagiotis Kanavos | } |
105 | d78cbf09 | Panagiotis Kanavos | |
106 | 7d915c34 | Panagiotis Kanavos | void OnShowProperties(IntPtr hWnd) |
107 | 7d915c34 | Panagiotis Kanavos | { |
108 | 7d915c34 | Panagiotis Kanavos | |
109 | 7d915c34 | Panagiotis Kanavos | } |
110 | d78cbf09 | Panagiotis Kanavos | |
111 | d78cbf09 | Panagiotis Kanavos | void OnVerbDisplayFileName(IntPtr hWnd) |
112 | d78cbf09 | Panagiotis Kanavos | { |
113 | d78cbf09 | Panagiotis Kanavos | string message = String.Format("The selected file is {0}\r\n\r\nThe selected Path is {1}", |
114 | d78cbf09 | Panagiotis Kanavos | Context.CurrentFile, |
115 | d78cbf09 | Panagiotis Kanavos | Context.CurrentFolder); |
116 | d78cbf09 | Panagiotis Kanavos | |
117 | d78cbf09 | Panagiotis Kanavos | System.Windows.Forms.MessageBox.Show( |
118 | d78cbf09 | Panagiotis Kanavos | message, |
119 | d78cbf09 | Panagiotis Kanavos | "CSShellExtContextMenuHandler"); |
120 | d78cbf09 | Panagiotis Kanavos | NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, |
121 | d78cbf09 | Panagiotis Kanavos | IntPtr.Zero, IntPtr.Zero); |
122 | d78cbf09 | Panagiotis Kanavos | } |
123 | 5bcf6d70 | Panagiotis Kanavos | |
124 | 5bcf6d70 | Panagiotis Kanavos | void OnGotoPithos(IntPtr hWnd) |
125 | 5bcf6d70 | Panagiotis Kanavos | { |
126 | 7d915c34 | Panagiotis Kanavos | var settings = Context.Settings; |
127 | 7d915c34 | Panagiotis Kanavos | var activeAccount = settings.Accounts.FirstOrDefault(acc => acc.IsActive); |
128 | 7d915c34 | Panagiotis Kanavos | var address = String.Format("{0}/ui/?token={1}&user={2}", |
129 | 7d915c34 | Panagiotis Kanavos | settings.PithosSite, |
130 | 7d915c34 | Panagiotis Kanavos | activeAccount.ApiKey, |
131 | 7d915c34 | Panagiotis Kanavos | Uri.EscapeUriString(activeAccount.AccountName)); |
132 | 7d915c34 | Panagiotis Kanavos | |
133 | 7d915c34 | Panagiotis Kanavos | settings.Reload(); |
134 | 7d915c34 | Panagiotis Kanavos | Process.Start(address); |
135 | 5bcf6d70 | Panagiotis Kanavos | } |
136 | d78cbf09 | Panagiotis Kanavos | |
137 | d78cbf09 | Panagiotis Kanavos | |
138 | d78cbf09 | Panagiotis Kanavos | #region Shell Extension Registration |
139 | d78cbf09 | Panagiotis Kanavos | |
140 | d78cbf09 | Panagiotis Kanavos | [ComRegisterFunction] |
141 | d78cbf09 | Panagiotis Kanavos | public static void Register(Type t) |
142 | d78cbf09 | Panagiotis Kanavos | { |
143 | d78cbf09 | Panagiotis Kanavos | try |
144 | d78cbf09 | Panagiotis Kanavos | { |
145 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, ".cs", |
146 | d78cbf09 | Panagiotis Kanavos | MenuHandlername); |
147 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, "Directory", |
148 | d78cbf09 | Panagiotis Kanavos | MenuHandlername); |
149 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, @"Directory\Background", |
150 | d78cbf09 | Panagiotis Kanavos | MenuHandlername); |
151 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, "*", |
152 | d78cbf09 | Panagiotis Kanavos | MenuHandlername); |
153 | d78cbf09 | Panagiotis Kanavos | |
154 | d78cbf09 | Panagiotis Kanavos | //ShellExtReg.MarkApproved(t.GUID, MenuHandlername); |
155 | d78cbf09 | Panagiotis Kanavos | } |
156 | d78cbf09 | Panagiotis Kanavos | catch (Exception ex) |
157 | d78cbf09 | Panagiotis Kanavos | { |
158 | d78cbf09 | Panagiotis Kanavos | Console.WriteLine(ex.Message); // Log the error |
159 | d78cbf09 | Panagiotis Kanavos | throw; // Re-throw the exception |
160 | d78cbf09 | Panagiotis Kanavos | } |
161 | d78cbf09 | Panagiotis Kanavos | } |
162 | d78cbf09 | Panagiotis Kanavos | |
163 | d78cbf09 | Panagiotis Kanavos | [ComUnregisterFunction] |
164 | d78cbf09 | Panagiotis Kanavos | public static void Unregister(Type t) |
165 | d78cbf09 | Panagiotis Kanavos | { |
166 | d78cbf09 | Panagiotis Kanavos | try |
167 | d78cbf09 | Panagiotis Kanavos | { |
168 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, ".cs", MenuHandlername); |
169 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, "Directory", MenuHandlername); |
170 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, @"Directory\Background", MenuHandlername); |
171 | d78cbf09 | Panagiotis Kanavos | ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, "*", MenuHandlername); |
172 | d78cbf09 | Panagiotis Kanavos | |
173 | d78cbf09 | Panagiotis Kanavos | //ShellExtReg.RemoveApproved(t.GUID, MenuHandlername); |
174 | d78cbf09 | Panagiotis Kanavos | } |
175 | d78cbf09 | Panagiotis Kanavos | catch (Exception ex) |
176 | d78cbf09 | Panagiotis Kanavos | { |
177 | d78cbf09 | Panagiotis Kanavos | Console.WriteLine(ex.Message); // Log the error |
178 | d78cbf09 | Panagiotis Kanavos | throw; // Re-throw the exception |
179 | d78cbf09 | Panagiotis Kanavos | } |
180 | d78cbf09 | Panagiotis Kanavos | } |
181 | d78cbf09 | Panagiotis Kanavos | |
182 | d78cbf09 | Panagiotis Kanavos | #endregion |
183 | d78cbf09 | Panagiotis Kanavos | |
184 | d78cbf09 | Panagiotis Kanavos | |
185 | d78cbf09 | Panagiotis Kanavos | #region IShellExtInit Members |
186 | d78cbf09 | Panagiotis Kanavos | |
187 | d78cbf09 | Panagiotis Kanavos | /// <summary> |
188 | d78cbf09 | Panagiotis Kanavos | /// Initialize the context menu handler. |
189 | d78cbf09 | Panagiotis Kanavos | /// </summary> |
190 | d78cbf09 | Panagiotis Kanavos | /// <param name="pidlFolder"> |
191 | d78cbf09 | Panagiotis Kanavos | /// A pointer to an ITEMIDLIST structure that uniquely identifies a folder. |
192 | d78cbf09 | Panagiotis Kanavos | /// </param> |
193 | d78cbf09 | Panagiotis Kanavos | /// <param name="pDataObj"> |
194 | d78cbf09 | Panagiotis Kanavos | /// A pointer to an IDataObject interface object that can be used to retrieve |
195 | d78cbf09 | Panagiotis Kanavos | /// the objects being acted upon. |
196 | d78cbf09 | Panagiotis Kanavos | /// </param> |
197 | d78cbf09 | Panagiotis Kanavos | /// <param name="hKeyProgID"> |
198 | d78cbf09 | Panagiotis Kanavos | /// The registry key for the file object or folder type. |
199 | d78cbf09 | Panagiotis Kanavos | /// </param> |
200 | d78cbf09 | Panagiotis Kanavos | public void Initialize(IntPtr pidlFolder, IntPtr pDataObj, IntPtr hKeyProgID) |
201 | d78cbf09 | Panagiotis Kanavos | { |
202 | d78cbf09 | Panagiotis Kanavos | |
203 | d78cbf09 | Panagiotis Kanavos | if(pDataObj == IntPtr.Zero && pidlFolder == IntPtr.Zero) |
204 | d78cbf09 | Panagiotis Kanavos | { |
205 | d78cbf09 | Panagiotis Kanavos | throw new ArgumentException("pidlFolder and pDataObj shouldn't be null at the same time"); |
206 | d78cbf09 | Panagiotis Kanavos | } |
207 | d78cbf09 | Panagiotis Kanavos | |
208 | d78cbf09 | Panagiotis Kanavos | |
209 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Initializing", LogCategories.ShellMenu); |
210 | d78cbf09 | Panagiotis Kanavos | |
211 | d78cbf09 | Panagiotis Kanavos | if (pDataObj != IntPtr.Zero) |
212 | d78cbf09 | Panagiotis Kanavos | { |
213 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Got a data object", LogCategories.ShellMenu); |
214 | d78cbf09 | Panagiotis Kanavos | |
215 | d78cbf09 | Panagiotis Kanavos | FORMATETC fe = new FORMATETC(); |
216 | d78cbf09 | Panagiotis Kanavos | fe.cfFormat = (short)CLIPFORMAT.CF_HDROP; |
217 | d78cbf09 | Panagiotis Kanavos | fe.ptd = IntPtr.Zero; |
218 | d78cbf09 | Panagiotis Kanavos | fe.dwAspect = DVASPECT.DVASPECT_CONTENT; |
219 | d78cbf09 | Panagiotis Kanavos | fe.lindex = -1; |
220 | d78cbf09 | Panagiotis Kanavos | fe.tymed = TYMED.TYMED_HGLOBAL; |
221 | d78cbf09 | Panagiotis Kanavos | STGMEDIUM stm = new STGMEDIUM(); |
222 | d78cbf09 | Panagiotis Kanavos | |
223 | d78cbf09 | Panagiotis Kanavos | // The pDataObj pointer contains the objects being acted upon. In this |
224 | d78cbf09 | Panagiotis Kanavos | // example, we get an HDROP handle for enumerating the selected files |
225 | d78cbf09 | Panagiotis Kanavos | // and folders. |
226 | d78cbf09 | Panagiotis Kanavos | IDataObject dataObject = (IDataObject)Marshal.GetObjectForIUnknown(pDataObj); |
227 | d78cbf09 | Panagiotis Kanavos | dataObject.GetData(ref fe, out stm); |
228 | d78cbf09 | Panagiotis Kanavos | |
229 | d78cbf09 | Panagiotis Kanavos | try |
230 | d78cbf09 | Panagiotis Kanavos | { |
231 | d78cbf09 | Panagiotis Kanavos | // Get an HDROP handle. |
232 | d78cbf09 | Panagiotis Kanavos | IntPtr hDrop = stm.unionmember; |
233 | d78cbf09 | Panagiotis Kanavos | if (hDrop == IntPtr.Zero) |
234 | d78cbf09 | Panagiotis Kanavos | { |
235 | d78cbf09 | Panagiotis Kanavos | throw new ArgumentException(); |
236 | d78cbf09 | Panagiotis Kanavos | } |
237 | d78cbf09 | Panagiotis Kanavos | |
238 | d78cbf09 | Panagiotis Kanavos | // Determine how many files are involved in this operation. |
239 | d78cbf09 | Panagiotis Kanavos | uint nFiles = NativeMethods.DragQueryFile(hDrop, UInt32.MaxValue, null, 0); |
240 | d78cbf09 | Panagiotis Kanavos | |
241 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine(String.Format("Got {0} files", nFiles), LogCategories.ShellMenu); |
242 | d78cbf09 | Panagiotis Kanavos | // This code sample displays the custom context menu item when only |
243 | d78cbf09 | Panagiotis Kanavos | // one file is selected. |
244 | d78cbf09 | Panagiotis Kanavos | if (nFiles == 1) |
245 | d78cbf09 | Panagiotis Kanavos | { |
246 | d78cbf09 | Panagiotis Kanavos | // Get the path of the file. |
247 | d78cbf09 | Panagiotis Kanavos | var fileName = new StringBuilder(260); |
248 | d78cbf09 | Panagiotis Kanavos | if (0 == NativeMethods.DragQueryFile(hDrop, 0, fileName, |
249 | d78cbf09 | Panagiotis Kanavos | fileName.Capacity)) |
250 | d78cbf09 | Panagiotis Kanavos | { |
251 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
252 | d78cbf09 | Panagiotis Kanavos | } |
253 | d78cbf09 | Panagiotis Kanavos | Context.CurrentFile = fileName.ToString(); |
254 | d78cbf09 | Panagiotis Kanavos | } |
255 | d78cbf09 | Panagiotis Kanavos | /* else |
256 | d78cbf09 | Panagiotis Kanavos | { |
257 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
258 | d78cbf09 | Panagiotis Kanavos | }*/ |
259 | d78cbf09 | Panagiotis Kanavos | |
260 | d78cbf09 | Panagiotis Kanavos | // [-or-] |
261 | d78cbf09 | Panagiotis Kanavos | |
262 | d78cbf09 | Panagiotis Kanavos | // Enumerate the selected files and folders. |
263 | d78cbf09 | Panagiotis Kanavos | //if (nFiles > 0) |
264 | d78cbf09 | Panagiotis Kanavos | //{ |
265 | d78cbf09 | Panagiotis Kanavos | // StringCollection selectedFiles = new StringCollection(); |
266 | d78cbf09 | Panagiotis Kanavos | // StringBuilder fileName = new StringBuilder(260); |
267 | d78cbf09 | Panagiotis Kanavos | // for (uint i = 0; i < nFiles; i++) |
268 | d78cbf09 | Panagiotis Kanavos | // { |
269 | d78cbf09 | Panagiotis Kanavos | // // Get the next file name. |
270 | d78cbf09 | Panagiotis Kanavos | // if (0 != NativeMethods.DragQueryFile(hDrop, i, fileName, |
271 | d78cbf09 | Panagiotis Kanavos | // fileName.Capacity)) |
272 | d78cbf09 | Panagiotis Kanavos | // { |
273 | d78cbf09 | Panagiotis Kanavos | // // Add the file name to the list. |
274 | d78cbf09 | Panagiotis Kanavos | // selectedFiles.Add(fileName.ToString()); |
275 | d78cbf09 | Panagiotis Kanavos | // } |
276 | d78cbf09 | Panagiotis Kanavos | // } |
277 | d78cbf09 | Panagiotis Kanavos | // |
278 | d78cbf09 | Panagiotis Kanavos | // // If we did not find any files we can work with, throw |
279 | d78cbf09 | Panagiotis Kanavos | // // exception. |
280 | d78cbf09 | Panagiotis Kanavos | // if (selectedFiles.Count == 0) |
281 | d78cbf09 | Panagiotis Kanavos | // { |
282 | d78cbf09 | Panagiotis Kanavos | // Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
283 | d78cbf09 | Panagiotis Kanavos | // } |
284 | d78cbf09 | Panagiotis Kanavos | //} |
285 | d78cbf09 | Panagiotis Kanavos | //else |
286 | d78cbf09 | Panagiotis Kanavos | //{ |
287 | d78cbf09 | Panagiotis Kanavos | // Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
288 | d78cbf09 | Panagiotis Kanavos | //} |
289 | d78cbf09 | Panagiotis Kanavos | } |
290 | d78cbf09 | Panagiotis Kanavos | finally |
291 | d78cbf09 | Panagiotis Kanavos | { |
292 | d78cbf09 | Panagiotis Kanavos | NativeMethods.ReleaseStgMedium(ref stm); |
293 | d78cbf09 | Panagiotis Kanavos | } |
294 | d78cbf09 | Panagiotis Kanavos | } |
295 | d78cbf09 | Panagiotis Kanavos | |
296 | d78cbf09 | Panagiotis Kanavos | if (pidlFolder != IntPtr.Zero) |
297 | d78cbf09 | Panagiotis Kanavos | { |
298 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Got a folder", LogCategories.ShellMenu); |
299 | d78cbf09 | Panagiotis Kanavos | StringBuilder path = new StringBuilder(); |
300 | d78cbf09 | Panagiotis Kanavos | if (!NativeMethods.SHGetPathFromIDList(pidlFolder, path)) |
301 | d78cbf09 | Panagiotis Kanavos | { |
302 | d78cbf09 | Panagiotis Kanavos | int error = Marshal.GetHRForLastWin32Error(); |
303 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(error); |
304 | d78cbf09 | Panagiotis Kanavos | } |
305 | d78cbf09 | Panagiotis Kanavos | Context.CurrentFolder = path.ToString(); |
306 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine(String.Format("Folder is {0}", Context.CurrentFolder), LogCategories.ShellMenu); |
307 | d78cbf09 | Panagiotis Kanavos | } |
308 | d78cbf09 | Panagiotis Kanavos | } |
309 | d78cbf09 | Panagiotis Kanavos | |
310 | d78cbf09 | Panagiotis Kanavos | #endregion |
311 | d78cbf09 | Panagiotis Kanavos | |
312 | d78cbf09 | Panagiotis Kanavos | |
313 | d78cbf09 | Panagiotis Kanavos | #region IContextMenu Members |
314 | d78cbf09 | Panagiotis Kanavos | |
315 | d78cbf09 | Panagiotis Kanavos | /// <summary> |
316 | d78cbf09 | Panagiotis Kanavos | /// Add commands to a shortcut menu. |
317 | d78cbf09 | Panagiotis Kanavos | /// </summary> |
318 | d78cbf09 | Panagiotis Kanavos | /// <param name="hMenu">A handle to the shortcut menu.</param> |
319 | d78cbf09 | Panagiotis Kanavos | /// <param name="iMenu"> |
320 | d78cbf09 | Panagiotis Kanavos | /// The zero-based position at which to insert the first new menu item. |
321 | d78cbf09 | Panagiotis Kanavos | /// </param> |
322 | d78cbf09 | Panagiotis Kanavos | /// <param name="idCmdFirst"> |
323 | d78cbf09 | Panagiotis Kanavos | /// The minimum value that the handler can specify for a menu item ID. |
324 | d78cbf09 | Panagiotis Kanavos | /// </param> |
325 | d78cbf09 | Panagiotis Kanavos | /// <param name="idCmdLast"> |
326 | d78cbf09 | Panagiotis Kanavos | /// The maximum value that the handler can specify for a menu item ID. |
327 | d78cbf09 | Panagiotis Kanavos | /// </param> |
328 | d78cbf09 | Panagiotis Kanavos | /// <param name="uFlags"> |
329 | d78cbf09 | Panagiotis Kanavos | /// Optional flags that specify how the shortcut menu can be changed. |
330 | d78cbf09 | Panagiotis Kanavos | /// </param> |
331 | d78cbf09 | Panagiotis Kanavos | /// <returns> |
332 | d78cbf09 | Panagiotis Kanavos | /// If successful, returns an HRESULT value that has its severity value set |
333 | d78cbf09 | Panagiotis Kanavos | /// to SEVERITY_SUCCESS and its code value set to the offset of the largest |
334 | d78cbf09 | Panagiotis Kanavos | /// command identifier that was assigned, plus one. |
335 | d78cbf09 | Panagiotis Kanavos | /// </returns> |
336 | d78cbf09 | Panagiotis Kanavos | public int QueryContextMenu( |
337 | d78cbf09 | Panagiotis Kanavos | IntPtr hMenu, |
338 | d78cbf09 | Panagiotis Kanavos | uint iMenu, |
339 | d78cbf09 | Panagiotis Kanavos | uint idCmdFirst, |
340 | d78cbf09 | Panagiotis Kanavos | uint idCmdLast, |
341 | d78cbf09 | Panagiotis Kanavos | uint uFlags) |
342 | d78cbf09 | Panagiotis Kanavos | { |
343 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Start qcm", LogCategories.ShellMenu); |
344 | d78cbf09 | Panagiotis Kanavos | // If uFlags include CMF_DEFAULTONLY then we should not do anything. |
345 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine(String.Format("Flags {0}", uFlags), LogCategories.ShellMenu); |
346 | d78cbf09 | Panagiotis Kanavos | |
347 | d78cbf09 | Panagiotis Kanavos | if (((uint)CMF.CMF_DEFAULTONLY & uFlags) != 0) |
348 | d78cbf09 | Panagiotis Kanavos | { |
349 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Default only flag, returning", LogCategories.ShellMenu); |
350 | d78cbf09 | Panagiotis Kanavos | return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0); |
351 | d78cbf09 | Panagiotis Kanavos | } |
352 | d78cbf09 | Panagiotis Kanavos | |
353 | d78cbf09 | Panagiotis Kanavos | if (!Context.IsManaged) |
354 | d78cbf09 | Panagiotis Kanavos | { |
355 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Not a PITHOS folder",LogCategories.ShellMenu); |
356 | d78cbf09 | Panagiotis Kanavos | return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0); |
357 | d78cbf09 | Panagiotis Kanavos | } |
358 | d78cbf09 | Panagiotis Kanavos | |
359 | d78cbf09 | Panagiotis Kanavos | /* |
360 | d78cbf09 | Panagiotis Kanavos | if (!selectedFolder.ToLower().Contains("pithos")) |
361 | d78cbf09 | Panagiotis Kanavos | return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0); |
362 | d78cbf09 | Panagiotis Kanavos | */ |
363 | d78cbf09 | Panagiotis Kanavos | |
364 | d78cbf09 | Panagiotis Kanavos | // Use either InsertMenu or InsertMenuItem to add menu items. |
365 | d78cbf09 | Panagiotis Kanavos | |
366 | d78cbf09 | Panagiotis Kanavos | uint largestID = 0; |
367 | d78cbf09 | Panagiotis Kanavos | |
368 | d78cbf09 | Panagiotis Kanavos | DisplayFlags itemType = (Context.IsFolder) ? DisplayFlags.Folder : DisplayFlags.File; |
369 | d78cbf09 | Panagiotis Kanavos | |
370 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine(String.Format("Item Flags {0}", itemType), LogCategories.ShellMenu); |
371 | d78cbf09 | Panagiotis Kanavos | |
372 | 4d301e8e | Panagiotis Kanavos | if (!NativeMethods.InsertMenu(hMenu, idCmdFirst, MF.MF_SEPARATOR | MF.MF_BYPOSITION, 0, String.Empty)) |
373 | 4d301e8e | Panagiotis Kanavos | { |
374 | 5120f3cb | Panagiotis Kanavos | Log.ErrorFormat("Error adding separator 1\r\n{0}", Marshal.GetLastWin32Error()); |
375 | 4d301e8e | Panagiotis Kanavos | return Marshal.GetHRForLastWin32Error(); |
376 | 4d301e8e | Panagiotis Kanavos | } |
377 | 4d301e8e | Panagiotis Kanavos | |
378 | d78cbf09 | Panagiotis Kanavos | foreach (var menuItem in _items.Values) |
379 | d78cbf09 | Panagiotis Kanavos | { |
380 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine(String.Format("Menu Flags {0}", menuItem.DisplayFlags), LogCategories.ShellMenu); |
381 | d78cbf09 | Panagiotis Kanavos | if ((itemType & menuItem.DisplayFlags) != DisplayFlags.None) |
382 | d78cbf09 | Panagiotis Kanavos | { |
383 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Adding Menu", LogCategories.ShellMenu); |
384 | d78cbf09 | Panagiotis Kanavos | |
385 | d78cbf09 | Panagiotis Kanavos | MENUITEMINFO mii = menuItem.CreateInfo(idCmdFirst); |
386 | d78cbf09 | Panagiotis Kanavos | if (!NativeMethods.InsertMenuItem(hMenu, iMenu, true, ref mii)) |
387 | d78cbf09 | Panagiotis Kanavos | { |
388 | 5bcf6d70 | Panagiotis Kanavos | var lastError = Marshal.GetLastWin32Error(); |
389 | 5bcf6d70 | Panagiotis Kanavos | var lastErrorHR = Marshal.GetHRForLastWin32Error(); |
390 | 5bcf6d70 | Panagiotis Kanavos | return lastErrorHR; |
391 | d78cbf09 | Panagiotis Kanavos | } |
392 | d78cbf09 | Panagiotis Kanavos | if (largestID < menuItem.MenuDisplayId) |
393 | d78cbf09 | Panagiotis Kanavos | largestID = menuItem.MenuDisplayId; |
394 | d78cbf09 | Panagiotis Kanavos | } |
395 | d78cbf09 | Panagiotis Kanavos | } |
396 | d78cbf09 | Panagiotis Kanavos | |
397 | 0eea575a | Panagiotis Kanavos | Debug.Write("Adding Separator 1", LogCategories.ShellMenu); |
398 | d78cbf09 | Panagiotis Kanavos | // Add a separator. |
399 | 4d301e8e | Panagiotis Kanavos | /* MENUITEMINFO sep = new MENUITEMINFO(); |
400 | d78cbf09 | Panagiotis Kanavos | sep.cbSize = (uint)Marshal.SizeOf(sep); |
401 | d78cbf09 | Panagiotis Kanavos | sep.fMask = MIIM.MIIM_TYPE; |
402 | 4d301e8e | Panagiotis Kanavos | sep.fType = MFT.MFT_SEPARATOR;*/ |
403 | 4d301e8e | Panagiotis Kanavos | if (!NativeMethods.InsertMenu(hMenu, (uint)_items.Values.Count + idCmdFirst+1,MF.MF_SEPARATOR|MF.MF_BYPOSITION, 0, String.Empty)) |
404 | d78cbf09 | Panagiotis Kanavos | { |
405 | 5120f3cb | Panagiotis Kanavos | Log.ErrorFormat("Error adding separator 1\r\n{0}", Marshal.GetLastWin32Error()); |
406 | d78cbf09 | Panagiotis Kanavos | return Marshal.GetHRForLastWin32Error(); |
407 | d78cbf09 | Panagiotis Kanavos | } |
408 | d78cbf09 | Panagiotis Kanavos | |
409 | d78cbf09 | Panagiotis Kanavos | |
410 | d78cbf09 | Panagiotis Kanavos | |
411 | d78cbf09 | Panagiotis Kanavos | |
412 | 0eea575a | Panagiotis Kanavos | Debug.WriteLine("Menus added", LogCategories.ShellOverlays); |
413 | d78cbf09 | Panagiotis Kanavos | // Return an HRESULT value with the severity set to SEVERITY_SUCCESS. |
414 | d78cbf09 | Panagiotis Kanavos | // Set the code value to the offset of the largest command identifier |
415 | d78cbf09 | Panagiotis Kanavos | // that was assigned, plus one (1). |
416 | d78cbf09 | Panagiotis Kanavos | return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, |
417 | d78cbf09 | Panagiotis Kanavos | largestID + 1); |
418 | d78cbf09 | Panagiotis Kanavos | } |
419 | d78cbf09 | Panagiotis Kanavos | |
420 | d78cbf09 | Panagiotis Kanavos | /// <summary> |
421 | d78cbf09 | Panagiotis Kanavos | /// Carry out the command associated with a shortcut menu item. |
422 | d78cbf09 | Panagiotis Kanavos | /// </summary> |
423 | d78cbf09 | Panagiotis Kanavos | /// <param name="pici"> |
424 | d78cbf09 | Panagiotis Kanavos | /// A pointer to a CMINVOKECOMMANDINFO or CMINVOKECOMMANDINFOEX structure |
425 | d78cbf09 | Panagiotis Kanavos | /// containing information about the command. |
426 | d78cbf09 | Panagiotis Kanavos | /// </param> |
427 | d78cbf09 | Panagiotis Kanavos | public void InvokeCommand(IntPtr pici) |
428 | d78cbf09 | Panagiotis Kanavos | { |
429 | d78cbf09 | Panagiotis Kanavos | bool isUnicode = false; |
430 | d78cbf09 | Panagiotis Kanavos | |
431 | d78cbf09 | Panagiotis Kanavos | // Determine which structure is being passed in, CMINVOKECOMMANDINFO or |
432 | d78cbf09 | Panagiotis Kanavos | // CMINVOKECOMMANDINFOEX based on the cbSize member of lpcmi. Although |
433 | d78cbf09 | Panagiotis Kanavos | // the lpcmi parameter is declared in Shlobj.h as a CMINVOKECOMMANDINFO |
434 | d78cbf09 | Panagiotis Kanavos | // structure, in practice it often points to a CMINVOKECOMMANDINFOEX |
435 | d78cbf09 | Panagiotis Kanavos | // structure. This struct is an extended version of CMINVOKECOMMANDINFO |
436 | d78cbf09 | Panagiotis Kanavos | // and has additional members that allow Unicode strings to be passed. |
437 | d78cbf09 | Panagiotis Kanavos | CMINVOKECOMMANDINFO ici = (CMINVOKECOMMANDINFO)Marshal.PtrToStructure( |
438 | d78cbf09 | Panagiotis Kanavos | pici, typeof(CMINVOKECOMMANDINFO)); |
439 | d78cbf09 | Panagiotis Kanavos | CMINVOKECOMMANDINFOEX iciex = new CMINVOKECOMMANDINFOEX(); |
440 | d78cbf09 | Panagiotis Kanavos | if (ici.cbSize == Marshal.SizeOf(typeof(CMINVOKECOMMANDINFOEX))) |
441 | d78cbf09 | Panagiotis Kanavos | { |
442 | d78cbf09 | Panagiotis Kanavos | if ((ici.fMask & CMIC.CMIC_MASK_UNICODE) != 0) |
443 | d78cbf09 | Panagiotis Kanavos | { |
444 | d78cbf09 | Panagiotis Kanavos | isUnicode = true; |
445 | d78cbf09 | Panagiotis Kanavos | iciex = (CMINVOKECOMMANDINFOEX)Marshal.PtrToStructure(pici, |
446 | d78cbf09 | Panagiotis Kanavos | typeof(CMINVOKECOMMANDINFOEX)); |
447 | d78cbf09 | Panagiotis Kanavos | } |
448 | d78cbf09 | Panagiotis Kanavos | } |
449 | d78cbf09 | Panagiotis Kanavos | |
450 | d78cbf09 | Panagiotis Kanavos | // Determines whether the command is identified by its offset or verb. |
451 | d78cbf09 | Panagiotis Kanavos | // There are two ways to identify commands: |
452 | d78cbf09 | Panagiotis Kanavos | // |
453 | d78cbf09 | Panagiotis Kanavos | // 1) The command's verb string |
454 | d78cbf09 | Panagiotis Kanavos | // 2) The command's identifier offset |
455 | d78cbf09 | Panagiotis Kanavos | // |
456 | d78cbf09 | Panagiotis Kanavos | // If the high-order word of lpcmi->lpVerb (for the ANSI case) or |
457 | d78cbf09 | Panagiotis Kanavos | // lpcmi->lpVerbW (for the Unicode case) is nonzero, lpVerb or lpVerbW |
458 | d78cbf09 | Panagiotis Kanavos | // holds a verb string. If the high-order word is zero, the command |
459 | d78cbf09 | Panagiotis Kanavos | // offset is in the low-order word of lpcmi->lpVerb. |
460 | d78cbf09 | Panagiotis Kanavos | |
461 | d78cbf09 | Panagiotis Kanavos | // For the ANSI case, if the high-order word is not zero, the command's |
462 | d78cbf09 | Panagiotis Kanavos | // verb string is in lpcmi->lpVerb. |
463 | d78cbf09 | Panagiotis Kanavos | if (!isUnicode && NativeMethods.HighWord(ici.verb.ToInt32()) != 0) |
464 | d78cbf09 | Panagiotis Kanavos | { |
465 | d78cbf09 | Panagiotis Kanavos | // Is the verb supported by this context menu extension? |
466 | d78cbf09 | Panagiotis Kanavos | string verbAnsi = Marshal.PtrToStringAnsi(ici.verb); |
467 | d78cbf09 | Panagiotis Kanavos | if (_items.ContainsKey(verbAnsi)) |
468 | d78cbf09 | Panagiotis Kanavos | { |
469 | d78cbf09 | Panagiotis Kanavos | _items[verbAnsi].MenuCommand(ici.hwnd); |
470 | d78cbf09 | Panagiotis Kanavos | } |
471 | d78cbf09 | Panagiotis Kanavos | else |
472 | d78cbf09 | Panagiotis Kanavos | { |
473 | d78cbf09 | Panagiotis Kanavos | // If the verb is not recognized by the context menu handler, it |
474 | d78cbf09 | Panagiotis Kanavos | // must return E_FAIL to allow it to be passed on to the other |
475 | d78cbf09 | Panagiotis Kanavos | // context menu handlers that might implement that verb. |
476 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
477 | d78cbf09 | Panagiotis Kanavos | } |
478 | d78cbf09 | Panagiotis Kanavos | } |
479 | d78cbf09 | Panagiotis Kanavos | |
480 | d78cbf09 | Panagiotis Kanavos | // For the Unicode case, if the high-order word is not zero, the |
481 | d78cbf09 | Panagiotis Kanavos | // command's verb string is in lpcmi->lpVerbW. |
482 | d78cbf09 | Panagiotis Kanavos | else if (isUnicode && NativeMethods.HighWord(iciex.verbW.ToInt32()) != 0) |
483 | d78cbf09 | Panagiotis Kanavos | { |
484 | d78cbf09 | Panagiotis Kanavos | // Is the verb supported by this context menu extension? |
485 | d78cbf09 | Panagiotis Kanavos | string verbUTF = Marshal.PtrToStringUni(iciex.verbW); |
486 | d78cbf09 | Panagiotis Kanavos | if (_items.ContainsKey(verbUTF)) |
487 | d78cbf09 | Panagiotis Kanavos | { |
488 | d78cbf09 | Panagiotis Kanavos | _items[verbUTF].MenuCommand(ici.hwnd); |
489 | d78cbf09 | Panagiotis Kanavos | } |
490 | d78cbf09 | Panagiotis Kanavos | else |
491 | d78cbf09 | Panagiotis Kanavos | { |
492 | d78cbf09 | Panagiotis Kanavos | // If the verb is not recognized by the context menu handler, it |
493 | d78cbf09 | Panagiotis Kanavos | // must return E_FAIL to allow it to be passed on to the other |
494 | d78cbf09 | Panagiotis Kanavos | // context menu handlers that might implement that verb. |
495 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
496 | d78cbf09 | Panagiotis Kanavos | } |
497 | d78cbf09 | Panagiotis Kanavos | } |
498 | d78cbf09 | Panagiotis Kanavos | |
499 | d78cbf09 | Panagiotis Kanavos | // If the command cannot be identified through the verb string, then |
500 | d78cbf09 | Panagiotis Kanavos | // check the identifier offset. |
501 | d78cbf09 | Panagiotis Kanavos | else |
502 | d78cbf09 | Panagiotis Kanavos | { |
503 | d78cbf09 | Panagiotis Kanavos | // Is the command identifier offset supported by this context menu |
504 | d78cbf09 | Panagiotis Kanavos | // extension? |
505 | d78cbf09 | Panagiotis Kanavos | int menuID = NativeMethods.LowWord(ici.verb.ToInt32()); |
506 | d78cbf09 | Panagiotis Kanavos | var menuItem = _items.FirstOrDefault(item => item.Value.MenuDisplayId == menuID).Value; |
507 | d78cbf09 | Panagiotis Kanavos | if (menuItem != null) |
508 | d78cbf09 | Panagiotis Kanavos | { |
509 | d78cbf09 | Panagiotis Kanavos | menuItem.MenuCommand(ici.hwnd); |
510 | d78cbf09 | Panagiotis Kanavos | } |
511 | d78cbf09 | Panagiotis Kanavos | else |
512 | d78cbf09 | Panagiotis Kanavos | { |
513 | d78cbf09 | Panagiotis Kanavos | // If the verb is not recognized by the context menu handler, it |
514 | d78cbf09 | Panagiotis Kanavos | // must return E_FAIL to allow it to be passed on to the other |
515 | d78cbf09 | Panagiotis Kanavos | // context menu handlers that might implement that verb. |
516 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.E_FAIL); |
517 | d78cbf09 | Panagiotis Kanavos | } |
518 | d78cbf09 | Panagiotis Kanavos | } |
519 | d78cbf09 | Panagiotis Kanavos | } |
520 | d78cbf09 | Panagiotis Kanavos | |
521 | d78cbf09 | Panagiotis Kanavos | /// <summary> |
522 | d78cbf09 | Panagiotis Kanavos | /// Get information about a shortcut menu command, including the help string |
523 | d78cbf09 | Panagiotis Kanavos | /// and the language-independent, or canonical, name for the command. |
524 | d78cbf09 | Panagiotis Kanavos | /// </summary> |
525 | d78cbf09 | Panagiotis Kanavos | /// <param name="idCmd">Menu command identifier offset.</param> |
526 | d78cbf09 | Panagiotis Kanavos | /// <param name="uFlags"> |
527 | d78cbf09 | Panagiotis Kanavos | /// Flags specifying the information to return. This parameter can have one |
528 | d78cbf09 | Panagiotis Kanavos | /// of the following values: GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VALIDATEA, |
529 | d78cbf09 | Panagiotis Kanavos | /// GCS_VALIDATEW, GCS_VERBA, GCS_VERBW. |
530 | d78cbf09 | Panagiotis Kanavos | /// </param> |
531 | d78cbf09 | Panagiotis Kanavos | /// <param name="pReserved">Reserved. Must be IntPtr.Zero</param> |
532 | d78cbf09 | Panagiotis Kanavos | /// <param name="pszName"> |
533 | d78cbf09 | Panagiotis Kanavos | /// The address of the buffer to receive the null-terminated string being |
534 | d78cbf09 | Panagiotis Kanavos | /// retrieved. |
535 | d78cbf09 | Panagiotis Kanavos | /// </param> |
536 | d78cbf09 | Panagiotis Kanavos | /// <param name="cchMax"> |
537 | d78cbf09 | Panagiotis Kanavos | /// Size of the buffer, in characters, to receive the null-terminated string. |
538 | d78cbf09 | Panagiotis Kanavos | /// </param> |
539 | d78cbf09 | Panagiotis Kanavos | public void GetCommandString( |
540 | d78cbf09 | Panagiotis Kanavos | UIntPtr idCmd, |
541 | d78cbf09 | Panagiotis Kanavos | uint uFlags, |
542 | d78cbf09 | Panagiotis Kanavos | IntPtr pReserved, |
543 | d78cbf09 | Panagiotis Kanavos | StringBuilder pszName, |
544 | d78cbf09 | Panagiotis Kanavos | uint cchMax) |
545 | d78cbf09 | Panagiotis Kanavos | { |
546 | d78cbf09 | Panagiotis Kanavos | uint menuID = idCmd.ToUInt32(); |
547 | d78cbf09 | Panagiotis Kanavos | var menuItem = _items.FirstOrDefault(item => item.Value.MenuDisplayId == menuID).Value; |
548 | d78cbf09 | Panagiotis Kanavos | if (menuItem != null) |
549 | d78cbf09 | Panagiotis Kanavos | { |
550 | d78cbf09 | Panagiotis Kanavos | switch ((GCS)uFlags) |
551 | d78cbf09 | Panagiotis Kanavos | { |
552 | d78cbf09 | Panagiotis Kanavos | case GCS.GCS_VERBW: |
553 | d78cbf09 | Panagiotis Kanavos | if (menuItem.VerbCanonicalName.Length > cchMax - 1) |
554 | d78cbf09 | Panagiotis Kanavos | { |
555 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.STRSAFE_E_INSUFFICIENT_BUFFER); |
556 | d78cbf09 | Panagiotis Kanavos | } |
557 | d78cbf09 | Panagiotis Kanavos | else |
558 | d78cbf09 | Panagiotis Kanavos | { |
559 | d78cbf09 | Panagiotis Kanavos | pszName.Clear(); |
560 | d78cbf09 | Panagiotis Kanavos | pszName.Append(menuItem.VerbCanonicalName); |
561 | d78cbf09 | Panagiotis Kanavos | } |
562 | d78cbf09 | Panagiotis Kanavos | break; |
563 | d78cbf09 | Panagiotis Kanavos | |
564 | d78cbf09 | Panagiotis Kanavos | case GCS.GCS_HELPTEXTW: |
565 | d78cbf09 | Panagiotis Kanavos | if (menuItem.VerbHelpText.Length > cchMax - 1) |
566 | d78cbf09 | Panagiotis Kanavos | { |
567 | d78cbf09 | Panagiotis Kanavos | Marshal.ThrowExceptionForHR(WinError.STRSAFE_E_INSUFFICIENT_BUFFER); |
568 | d78cbf09 | Panagiotis Kanavos | } |
569 | d78cbf09 | Panagiotis Kanavos | else |
570 | d78cbf09 | Panagiotis Kanavos | { |
571 | d78cbf09 | Panagiotis Kanavos | pszName.Clear(); |
572 | d78cbf09 | Panagiotis Kanavos | pszName.Append(menuItem.VerbHelpText); |
573 | d78cbf09 | Panagiotis Kanavos | } |
574 | d78cbf09 | Panagiotis Kanavos | break; |
575 | d78cbf09 | Panagiotis Kanavos | } |
576 | d78cbf09 | Panagiotis Kanavos | } |
577 | d78cbf09 | Panagiotis Kanavos | } |
578 | d78cbf09 | Panagiotis Kanavos | |
579 | d78cbf09 | Panagiotis Kanavos | #endregion |
580 | d78cbf09 | Panagiotis Kanavos | } |
581 | d78cbf09 | Panagiotis Kanavos | } |