3
3
4
4
using System . Drawing ;
5
5
using System . Runtime . InteropServices ;
6
- using Vanara . InteropServices ;
7
- using Vanara . PInvoke ;
8
- using Vanara . Windows . Shell ;
9
6
using Windows . Win32 ;
10
7
using Windows . Win32 . UI . WindowsAndMessaging ;
8
+ using Windows . Win32 . UI . Shell ;
9
+ using Windows . Win32 . Foundation ;
10
+ using Windows . Win32 . Graphics . Gdi ;
11
11
12
12
namespace Files . App . Utils . Shell
13
13
{
@@ -16,9 +16,9 @@ namespace Files.App.Utils.Shell
16
16
/// </summary>
17
17
public partial class ContextMenu : Win32ContextMenu , IDisposable
18
18
{
19
- private Shell32 . IContextMenu _cMenu ;
19
+ private IContextMenu _cMenu ;
20
20
21
- private User32 . SafeHMENU _hMenu ;
21
+ private HMENU _hMenu ;
22
22
23
23
private readonly ThreadWithMessageQueue _owningThread ;
24
24
@@ -31,7 +31,7 @@ public partial class ContextMenu : Win32ContextMenu, IDisposable
31
31
32
32
public List < string > ItemsPath { get ; }
33
33
34
- private ContextMenu ( Shell32 . IContextMenu cMenu , User32 . SafeHMENU hMenu , IEnumerable < string > itemsPath , ThreadWithMessageQueue owningThread , Func < string , bool > ? itemFilter )
34
+ private ContextMenu ( IContextMenu cMenu , HMENU hMenu , IEnumerable < string > itemsPath , ThreadWithMessageQueue owningThread , Func < string , bool > ? itemFilter )
35
35
{
36
36
_cMenu = cMenu ;
37
37
_hMenu = hMenu ;
@@ -64,10 +64,10 @@ public async Task<bool> InvokeVerb(string? verb)
64
64
{
65
65
var currentWindows = Win32Helper . GetDesktopWindows ( ) ;
66
66
67
- var pici = new Shell32 . CMINVOKECOMMANDINFOEX
67
+ var pici = new CMINVOKECOMMANDINFO
68
68
{
69
- lpVerb = new SafeResourceId ( verb , CharSet . Ansi ) ,
70
- nShow = ShowWindowCommand . SW_SHOWNORMAL ,
69
+ lpVerb = PCSTR . FromString ( verb ) ,
70
+ nShow = ( int ) SHOW_WINDOW_CMD . SW_SHOWNORMAL
71
71
} ;
72
72
73
73
pici . cbSize = ( uint ) Marshal . SizeOf ( pici ) ;
@@ -93,15 +93,15 @@ public async Task<bool> InvokeItem(int itemID, string? workingDirectory = null)
93
93
try
94
94
{
95
95
var currentWindows = Win32Helper . GetDesktopWindows ( ) ;
96
- var pici = new Shell32 . CMINVOKECOMMANDINFOEX
96
+ var pici = new CMINVOKECOMMANDINFO
97
97
{
98
- lpVerb = Macros . MAKEINTRESOURCE ( itemID ) ,
99
- nShow = ShowWindowCommand . SW_SHOWNORMAL ,
98
+ lpVerb = PCSTR . FromInt ( itemID ) ,
99
+ nShow = ( int ) SHOW_WINDOW_CMD . SW_SHOWNORMAL ,
100
100
} ;
101
101
102
102
pici . cbSize = ( uint ) Marshal . SizeOf ( pici ) ;
103
103
if ( workingDirectory is not null )
104
- pici . lpDirectoryW = workingDirectory ;
104
+ pici . lpDirectory = PCSTR . FromString ( workingDirectory ) ;
105
105
106
106
await _owningThread . PostMethod ( ( ) => _cMenu . InvokeCommand ( pici ) ) ;
107
107
Win32Helper . BringToForeground ( currentWindows ) ;
@@ -161,9 +161,9 @@ public async Task<bool> InvokeItem(int itemID, string? workingDirectory = null)
161
161
// NOTE: The items are all in the same folder
162
162
using var sf = shellItems [ 0 ] . Parent ;
163
163
164
- Shell32 . IContextMenu menu = sf . GetChildrenUIObjects < Shell32 . IContextMenu > ( default , shellItems ) ;
165
- var hMenu = User32 . CreatePopupMenu ( ) ;
166
- menu . QueryContextMenu ( hMenu , 0 , 1 , 0x7FFF , ( Shell32 . CMF ) flags ) ;
164
+ IContextMenu menu = sf . GetChildrenUIObjects < IContextMenu > ( default , shellItems ) ;
165
+ var hMenu = PInvoke . CreatePopupMenu ( ) ;
166
+ menu . QueryContextMenu ( hMenu , 0 , 1 , 0x7FFF , flags ) ;
167
167
var contextMenu = new ContextMenu ( menu , hMenu , shellItems . Select ( x => x . ParsingName ) , owningThread , itemFilter ) ;
168
168
contextMenu . EnumMenuItems ( hMenu , contextMenu . Items ) ;
169
169
@@ -181,34 +181,34 @@ public static async Task WarmUpQueryContextMenuAsync()
181
181
using var cMenu = await GetContextMenuForFiles ( new string [ ] { $@ "{ Constants . UserEnvironmentPaths . SystemDrivePath } \" } , PInvoke . CMF_NORMAL ) ;
182
182
}
183
183
184
- private void EnumMenuItems ( Vanara . PInvoke . HMENU hMenu , List < Win32ContextMenuItem > menuItemsResult , bool loadSubenus = false )
184
+ private void EnumMenuItems ( HMENU hMenu , List < Win32ContextMenuItem > menuItemsResult , bool loadSubenus = false )
185
185
{
186
- var itemCount = User32 . GetMenuItemCount ( hMenu ) ;
186
+ var itemCount = PInvoke . GetMenuItemCount ( hMenu ) ;
187
187
188
- var menuItemInfo = new User32 . MENUITEMINFO ( )
188
+ var menuItemInfo = new MENUITEMINFOW ( )
189
189
{
190
190
fMask =
191
- User32 . MenuItemInfoMask . MIIM_BITMAP |
192
- User32 . MenuItemInfoMask . MIIM_FTYPE |
193
- User32 . MenuItemInfoMask . MIIM_STRING |
194
- User32 . MenuItemInfoMask . MIIM_ID |
195
- User32 . MenuItemInfoMask . MIIM_SUBMENU ,
191
+ MENU_ITEM_MASK . MIIM_BITMAP |
192
+ MENU_ITEM_MASK . MIIM_FTYPE |
193
+ MENU_ITEM_MASK . MIIM_STRING |
194
+ MENU_ITEM_MASK . MIIM_ID |
195
+ MENU_ITEM_MASK . MIIM_SUBMENU ,
196
196
} ;
197
197
198
198
menuItemInfo . cbSize = ( uint ) Marshal . SizeOf ( menuItemInfo ) ;
199
199
200
200
for ( uint index = 0 ; index < itemCount ; index ++ )
201
201
{
202
202
var menuItem = new ContextMenuItem ( ) ;
203
- var container = new SafeCoTaskMemString ( 512 ) ;
204
- var cMenu2 = _cMenu as Shell32 . IContextMenu2 ;
203
+ var container = new Marshal . SafeCoTaskMemString ( 512 ) ;
204
+ var cMenu2 = _cMenu as IContextMenu2 ;
205
205
206
206
menuItemInfo . dwTypeData = ( IntPtr ) container ;
207
207
208
208
// See also, https://devblogs.microsoft.com/oldnewthing/20040928-00/?p=37723
209
209
menuItemInfo . cch = ( uint ) container . Capacity - 1 ;
210
210
211
- var result = User32 . GetMenuItemInfo ( hMenu , index , true , ref menuItemInfo ) ;
211
+ var result = PInvoke . GetMenuItemInfo ( new , index , true , ref menuItemInfo ) ;
212
212
if ( ! result )
213
213
{
214
214
container . Dispose ( ) ;
@@ -234,7 +234,7 @@ private void EnumMenuItems(Vanara.PInvoke.HMENU hMenu, List<Win32ContextMenuItem
234
234
continue ;
235
235
}
236
236
237
- if ( menuItemInfo . hbmpItem != HBITMAP . NULL && ! Enum . IsDefined ( typeof ( HBITMAP_HMENU ) , ( ( IntPtr ) menuItemInfo . hbmpItem ) . ToInt64 ( ) ) )
237
+ if ( menuItemInfo . hbmpItem != HBITMAP . Null && ! Enum . IsDefined ( typeof ( HBITMAP_HMENU ) , ( ( IntPtr ) menuItemInfo . hbmpItem ) . ToInt64 ( ) ) )
238
238
{
239
239
using var bitmap = Win32Helper . GetBitmapFromHBitmap ( menuItemInfo . hbmpItem ) ;
240
240
@@ -248,7 +248,7 @@ private void EnumMenuItems(Vanara.PInvoke.HMENU hMenu, List<Win32ContextMenuItem
248
248
}
249
249
}
250
250
251
- if ( menuItemInfo . hSubMenu != Vanara . PInvoke . HMENU . NULL )
251
+ if ( menuItemInfo . hSubMenu != HMENU . Null )
252
252
{
253
253
Debug . WriteLine ( "Item {0}: has submenu" , index ) ;
254
254
var subItems = new List < Win32ContextMenuItem > ( ) ;
@@ -267,7 +267,7 @@ void LoadSubMenu()
267
267
{
268
268
try
269
269
{
270
- cMenu2 ? . HandleMenuMsg ( ( uint ) User32 . WindowMessage . WM_INITMENUPOPUP , ( IntPtr ) hSubMenu , new IntPtr ( index ) ) ;
270
+ cMenu2 ? . HandleMenuMsg ( PInvoke . WM_INITMENUPOPUP , ( IntPtr ) hSubMenu , new IntPtr ( index ) ) ;
271
271
}
272
272
catch ( Exception ex ) when ( ex is InvalidCastException or ArgumentException )
273
273
{
@@ -316,7 +316,7 @@ public Task<bool> LoadSubMenu(List<Win32ContextMenuItem> subItems)
316
316
}
317
317
}
318
318
319
- private static string ? GetCommandString ( Shell32 . IContextMenu cMenu , uint offset , Shell32 . GCS flags = Shell32 . GCS . GCS_VERBW )
319
+ private static string ? GetCommandString ( IContextMenu cMenu , uint offset , GCS flags = GCS . GCS_VERBW )
320
320
{
321
321
// A workaround to avoid an AccessViolationException on some items,
322
322
// notably the "Run with graphic processor" menu item of NVIDIA cards
@@ -325,11 +325,11 @@ public Task<bool> LoadSubMenu(List<Win32ContextMenuItem> subItems)
325
325
return null ;
326
326
}
327
327
328
- SafeCoTaskMemString ? commandString = null ;
328
+ PSTR ? commandString = null ;
329
329
330
330
try
331
331
{
332
- commandString = new SafeCoTaskMemString ( 512 ) ;
332
+ commandString = new PSTR ( 512 ) ;
333
333
cMenu . GetCommandString ( new IntPtr ( offset ) , flags , IntPtr . Zero , commandString , ( uint ) commandString . Capacity - 1 ) ;
334
334
Debug . WriteLine ( "Verb {0}: {1}" , offset , commandString ) ;
335
335
@@ -374,7 +374,7 @@ protected virtual void Dispose(bool disposing)
374
374
// TODO: Free unmanaged resources (unmanaged objects) and override a finalizer below
375
375
if ( _hMenu is not null )
376
376
{
377
- User32 . DestroyMenu ( _hMenu ) ;
377
+ PInvoke . DestroyMenu ( _hMenu ) ;
378
378
_hMenu = null ;
379
379
}
380
380
if ( _cMenu is not null )
0 commit comments