• 0

C#: Get path of Start Menu programs (All USERS)


Question

hi guys

does anyone know how can i get the path of the start menu under All Users (X:\Documents and Settings\All Users\Start Menu\Programs) ?

i tried :

DirectoryInfo di = new DirectoryInfo(System.Environment.G? etFolderPath(Environment.SpecialFo? lder.Programs));

but that only gives the Path for current user. How can i get to the All Users start menu?

12 answers to this question

Recommended Posts

  • 0

The built-in .Net methods are underdeveloped, IMO. Use WinAPI.

See here for the function SHGetSpecialFolderPath, and a link to the list of CSIDL's you can use.

http://msdn2.microsoft.com/en-us/library/ms647816.aspx

Here's the function import and a sample on how to use it:

[DllImport("shell32.dll")]
static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner,
   [Out] StringBuilder lpszPath, int nFolder, bool fCreate);

const int CSIDL_PROGRAMS = 2;  // \Windows\Start Menu\Programs
StringBuilder path = new StringBuilder(260);
SHGetSpecialFolderPath(IntPtr.Zero, path, CSIDL_PROGRAMS, false);
// path.ToString() should now hold the path

Here's the full list of CSIDL's from ShlObj.h

const int CSIDL_DESKTOP 					= 0x0000;		// <desktop>
const int CSIDL_INTERNET					= 0x0001;		// Internet Explorer (icon on desktop)
const int CSIDL_PROGRAMS					  = 0x0002;		// Start Menu\Programs
const int CSIDL_CONTROLS					  = 0x0003;		// My Computer\Control Panel
const int CSIDL_PRINTERS					  = 0x0004;		// My Computer\Printers
const int CSIDL_PERSONAL					  = 0x0005;		// My Documents
const int CSIDL_FAVORITES				 	= 0x0006;		// <user name>\Favorites
const int CSIDL_STARTUP				   	= 0x0007;		// Start Menu\Programs\Startup
const int CSIDL_RECENT					  = 0x0008;		// <user name>\Recent
const int CSIDL_SENDTO					  = 0x0009;		// <user name>\SendTo
const int CSIDL_BITBUCKET				   = 0x000a;		// <desktop>\Recycle Bin
const int CSIDL_STARTMENU				   = 0x000b;		// <user name>\Start Menu
const int CSIDL_MYDOCUMENTS				 = CSIDL_PERSONAL; //  Personal was just a silly name for My Documents
const int CSIDL_MYMUSIC					 = 0x000d;		// "My Music" folder
const int CSIDL_MYVIDEO					 = 0x000e;		// "My Videos" folder
const int CSIDL_DESKTOPDIRECTORY			= 0x0010;		// <user name>\Desktop
const int CSIDL_DRIVES					  = 0x0011;		// My Computer
const int CSIDL_NETWORK					 = 0x0012;		// Network Neighborhood (My Network Places)
const int CSIDL_NETHOOD					 = 0x0013;		// <user name>\nethood
const int CSIDL_FONTS					   = 0x0014;		// windows\fonts
const int CSIDL_TEMPLATES				   = 0x0015;
const int CSIDL_COMMON_STARTMENU			= 0x0016;		// All Users\Start Menu
const int CSIDL_COMMON_PROGRAMS			 = 0x0017;		// All Users\Start Menu\Programs
const int CSIDL_COMMON_STARTUP			  = 0x0018;		// All Users\Startup
const int CSIDL_COMMON_DESKTOPDIRECTORY	 = 0x0019;		// All Users\Desktop
const int CSIDL_APPDATA					 = 0x001a;		// <user name>\Application Data
const int CSIDL_PRINTHOOD				   = 0x001b;		// <user name>\PrintHood
const int CSIDL_LOCAL_APPDATA			   = 0x001c;		// <user name>\Local Settings\Applicaiton Data (non roaming)
const int CSIDL_ALTSTARTUP				  = 0x001d;		// non localized startup
const int CSIDL_COMMON_ALTSTARTUP		   = 0x001e;		// non localized common startup
const int CSIDL_COMMON_FAVORITES			= 0x001f;
const int CSIDL_INTERNET_CACHE			  = 0x0020;
const int CSIDL_COOKIES					 = 0x0021;
const int CSIDL_HISTORY					 = 0x0022;
const int CSIDL_COMMON_APPDATA			  = 0x0023;		// All Users\Application Data
const int CSIDL_WINDOWS					 = 0x0024;		// GetWindowsDirectory()
const int CSIDL_SYSTEM					  = 0x0025;		// GetSystemDirectory()
const int CSIDL_PROGRAM_FILES			   = 0x0026;		// C:\Program Files
const int CSIDL_MYPICTURES				  = 0x0027;		// C:\Program Files\My Pictures
const int CSIDL_PROFILE					 = 0x0028;		// USERPROFILE
const int CSIDL_SYSTEMX86				   = 0x0029;		// x86 system directory on RISC
const int CSIDL_PROGRAM_FILESX86			= 0x002a;		// x86 C:\Program Files on RISC
const int CSIDL_PROGRAM_FILES_COMMON		= 0x002b;		// C:\Program Files\Common
const int CSIDL_PROGRAM_FILES_COMMONX86	 = 0x002c;		// x86 Program Files\Common on RISC
const int CSIDL_COMMON_TEMPLATES			= 0x002d;		// All Users\Templates
const int CSIDL_COMMON_DOCUMENTS			= 0x002e;		// All Users\Documents
const int CSIDL_COMMON_ADMINTOOLS		   = 0x002f;		// All Users\Start Menu\Programs\Administrative Tools
const int CSIDL_ADMINTOOLS				  = 0x0030;		// <user name>\Start Menu\Programs\Administrative Tools
const int CSIDL_CONNECTIONS				 = 0x0031;		// Network and Dial-up Connections
const int CSIDL_COMMON_MUSIC				= 0x0035;		// All Users\My Music
const int CSIDL_COMMON_PICTURES			 = 0x0036;		// All Users\My Pictures
const int CSIDL_COMMON_VIDEO				= 0x0037;		// All Users\My Video
const int CSIDL_RESOURCES				   = 0x0038;		// Resource Direcotry
const int CSIDL_RESOURCES_LOCALIZED		 = 0x0039;		// Localized Resource Direcotry
const int CSIDL_COMMON_OEM_LINKS			= 0x003a;		// Links to All Users OEM specific apps
const int CSIDL_CDBURN_AREA				 = 0x003b;		// USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
const int CSIDL_COMPUTERSNEARME			 = 0x003d;		// Computers Near Me (computered from Workgroup membership)
const int CSIDL_FLAG_CREATE				 = 0x8000;		// combine with CSIDL_ value to force folder creation in SHGetFolderPath()
const int CSIDL_FLAG_DONT_VERIFY			= 0x4000;		// combine with CSIDL_ value to return an unverified folder path
const int CSIDL_FLAG_DONT_UNEXPAND		  = 0x2000;		// combine with CSIDL_ value to avoid unexpanding environment variables
const int CSIDL_FLAG_NO_ALIAS			   = 0x1000;		// combine with CSIDL_ value to insure non-alias versions of the pidl
const int CSIDL_FLAG_PER_USER_INIT		  = 0x0800;		// combine with CSIDL_ value to indicate per-user init (eg. upgrade)

Note that this was quickly converted from the C++ headers to C#, so there may be simple formatting errors, but all of the data is correct.

Edited by jimbo11883
  • 0

Environment.GetEnvironmentVariable("ALLUSERSPROFILE")

return a string "DRIVE:\Documents and Settings\All Users" (from wikipedia), from there you should beable to get to the StartMenu\Programs

It doesnt work for me but im on Vista, all i get is an hidden folder called ProgramData.It might work on XP.

if not then switch "ALLUSERSPROFILE" with "HOMEDRIVE" and you will get just the drive windows is install on example "C:\" from there you can work your way to where you want to go.

Edited by Doli
  • 0
  On 27/01/2010 at 15:41, garethevans1986 said:

Dude this is like 2 years old!

yeah i know, but google found it when i was searching for this solution....

the code that i sent are only usable if you're looking for the user folders, if you need the Common folders, read this:

http://www.codeproject.com/KB/winsdk/SpecialFolders.aspx

  • 0
  On 27/01/2010 at 11:38, Tufo said:

I know its a late reply, but for ppl that find this post on google (like me) its quite simple to find the start menu folder:

String startMenuPath = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);

That returns the path for the current user's start menu startup.

  On 27/01/2010 at 15:41, garethevans1986 said:

Dude this is like 2 years old!

He apologized for the late reply and contributed something, what's the problem?

Thanks Tufo, I'm just working through the same problem. I think Jimbo's method is probably most reliable.

  • 0

99.9% of thread being replied to after being "dead" for 2+ years are either troll threads or spammers....

Granted, like you said this poster posted something relevant!

GE

  • 0

This thread may be 3 years old but no one has posted the correct answer yet.

Typically you would use

Environment.GetFolderPath

, but there is no constant defined for it.

Here is the correct solution using a Win32 API:

  class Program
    {
        [DllImport("shell32.dll")]
        static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner,
           [Out] StringBuilder lpszPath, int nFolder, bool fCreate);
        const int CSIDL_COMMON_STARTMENU = 0x16;  // \Windows\Start Menu\Programs

        static void Main(string[] args)
        {
            StringBuilder path = new StringBuilder(260);
            SHGetSpecialFolderPath(IntPtr.Zero, path, CSIDL_COMMON_STARTMENU, false);
            string s = path.ToString();
        }
    }

  • 0
  Quote
but there is no constant defined for it
Sure there is; in .NET 4 :)

Just like with registry access, the .NET implementation of the FolderPath APIs is lacking through version 3.5 SP1. However, starting with .NET 4.0, you can do the following:

Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)

Edit: the CODE tags screw up the character casing a little bit; the "s" should be capitalized

Edit 2: WTF, it's impossible to capitalize all three parts of that word anywhere in a forum post. Weird.

It would be nice if they would consider community contribution to the BCL for simple things like this. It's just an enum value and we shouldn't have to wrap 10 year-old APIs in P/Invoke (CSIDL_COMMON_STARTMENU has been available natively starting with XP). Actually, on closer look, it appears this was even defined in Windows 2000.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I’ve just paid £290/$390 for a 4TB Samsung 990 Pro for my PS5 Pro so it’s not too far from the going rate. Microsoft should definitely copy Sony and let users buy their own SSD in their next consoles rather than this proprietary stuff. I paid £374/$505 for the 2TB Seagate card for my Series X a few years ago so it’s not exactly over priced. 4TB of NVMe storage ain’t cheap!
    • The EU regulations force companies to respect users privacy, choice and data. Something all tech companies have abused to the hilt and would continue to do so if it wasn’t for important legislation and laws the EU brought in, which have been adopted elsewhere around the world. The EU can be a nuisance, but they actually do more good than harm. Forcing Apple, Google, Microsoft etc to make changes hasn’t negatively impacted anyone apart from their financials as they aren’t free to pillage our data like they once were, unless they explicitly provide options to obtain consent.
    • Windows 10 Enterprise IoT LTSC will continue getting updates until January 2032. I would expect support from most programs to continue until then. Firefox still supports Windows 7 (until the end of August), which will be just over 16 years since release. Windows 10 will be of a very similar age in January 2032. I'm sure some things like games will move on earlier, but I imagine a Windows 10 machine will be safe and usable for a long time to come yet, despite the pressure and fearmongering from those who stand to gain from selling you a new PC.
    • Refined dock and bug fixes land in latest Elementary OS 8 updates by David Uzondu If you're running Elementary OS 8, there's a new round of updates available, bringing some neat enhancements, particularly to its signature Dock and the underlying window manager, Gala. If you are not familiar, Elementary OS positions itself as a polished alternative to Windows and macOS. It runs its own custom desktop environment called Pantheon, with Gala handling all the window management magic, like animations and how windows behave. In the new update, the Dock gets some notable new tricks, including the return of a couple of features that old-school Plank (the Dock's foundation) users might remember. For starters, the Dock now shows multiple indicator dots beneath an app icon if you have more than one window open for that application, which is useful for quickly seeing what is running. Plus, if you are dragging something and hover over an app icon in the Dock, it will cycle through that app's open windows, making it easier to drop your item into the right place. You can also now long-press an app icon to bring up its context menu, a nice touch for those who prefer that interaction. The elementary OS team also squashed some bugs related to hide modes and memory usage, keeping things running smoothly. Gala itself recently got a massive update, addressing around 20 reported issues and introducing a brand new Gesture Controller. This means users can now swipe up in the Multitasking View to close windows, a slick and intuitive gesture. App titles are now always shown in Multitasking View, a significant improvement for touchscreen users. Users also get notified when they take a screenshot with a keyboard shortcut, and this notification lets them jump straight to the image in Files. Some other welcome Gala improvements include saving window states on sleep and shutdown, and fixing an annoying bug where menus might only show once. For gamers, a fix for Lutris Flatpak installations causing Gala to crash with GE Proton setups will be a relief, and users of the Postman app will be happy to know that window captures for it are no longer partially rendered. Shifting back to Elementary OS 8, in System Settings, choosing light or dark mode properly snoozes your schedule instead of outright disabling it. The Reduce Motion setting has been expanded to cover a wider array of animations, which is a blessing for folks prone to motion sickness. Hotcorners got some fixes too, and there is a new option to keep them active even when an application is full screen. Other notable updates include added screen reader support for notifications and the shortcut overlay, fixes for Flatpak sandbox issues that affected apps like Steam, and the latest version of GNOME Web, which brought better performance and a redesigned bookmarks sidebar. You can download all these updates by opening System Settings, heading to System, and hitting "Update All."
    • WSCC - Windows System Control Center 10.0.0.8 by Razvan Serea Windows System Control Center is a free, portable program that allows you to install, update, execute and organize the utilities from various system utility suites. WSCC can install and update the supported utilities automatically. Alternatively, WSCC can use the http protocol to download and run the programs. WSCC is portable, installation is not required. Extract the content of the downloaded zip archive to any directory on your computer. Free for personal use. The setup packages and updates are downloaded directly from their author's website! This edition of WSCC supports the following utility suites: Windows Sysinternals Suite (including support for "Sysinternals Live" service) NirSoft Utilities Mitec and more... WSCC - Windows System Control Center 10.0.0.8 changelog: Update Manager: scheduled updates will run even if WSCC is already running minor user interface improvements Download: WSCC (64-bit) | 6.9 MB (Free for personal use) Download: WSCC (32-bit) | 6.2 MB View: WSCC Homepage | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
  • Recent Achievements

    • Enthusiast
      Epaminombas went up a rank
      Enthusiast
    • Posting Machine
      Fiza Ali earned a badge
      Posting Machine
    • One Year In
      WaynesWorld earned a badge
      One Year In
    • First Post
      chriskinney317 earned a badge
      First Post
    • Week One Done
      Nullun earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      186
    2. 2
      snowy owl
      131
    3. 3
      ATLien_0
      127
    4. 4
      Xenon
      120
    5. 5
      +Edouard
      91
  • Tell a friend

    Love Neowin? Tell a friend!