以编程方式访问所有用户开始菜单

有谁知道如何以编程方式访问“所有用户”启动菜单?

在XP中,位于此处:

C:\Documents and Settings\All Users\Start Menu\Programs\Startup 

在Windows 7中,位于此处:

 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 

具体来说,我有一个安装和部署项目,我想在所有用户的启动菜单中为应用程序添加一个快捷方式,以便每当有人登录时启动应用程序。

编辑: 我很确定这是布莱恩得到答案的地方。

对于所有用户的开始菜单,没有为Environment.GetFolderPath的常规方式定义常量,但是你可以通过使用Win32 API SHGetSpecialFolderPath

 class Program { [DllImport("shell32.dll")] static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out] StringBuilder lpszPath, int nFolder, bool fCreate); const int CSIDL_COMMON_STARTMENU = 0x16; // All Users\Start Menu static void Main(string[] args) { StringBuilder path = new StringBuilder(260); SHGetSpecialFolderPath(IntPtr.Zero, path, CSIDL_COMMON_STARTMENU, false); string s = path.ToString(); } } 

在.NET 4中, CommonStartMenu被添加到Environment.SpecialFolder枚举中 ,因此您可以使用:

 Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu) 

“所有用户”驻留在ALLUSERSPROFILE环境变量中:

 C:\>dir "%ALLUSERSPROFILE%\Start Menu" Volume in drive C is awesome Volume Serial Number is 8C57-DB1A Directory of C:\Documents and Settings\All Users\Start Menu 12/28/2009 10:27 PM  . 12/28/2009 10:27 PM  .. 12/28/2009 10:01 PM 1,566 Microsoft Update.lnk 02/23/2010 09:57 PM  Programs 12/28/2009 10:27 PM 1,563 Set Program Access and Defaults.lnk 12/28/2009 08:51 PM 398 Windows Catalog.lnk 12/28/2009 08:51 PM 1,507 Windows Update.lnk 4 File(s) 5,034 bytes 3 Dir(s) 64,214,460,416 bytes free 

你也可以试试!

 string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs"; 

您可以使用适当的MSI属性访问启动文件夹(有关详细信息,请参阅此处 ): [StartupFolder ]

但是,对于依赖于用户的MSI变量,此属性通常指向用户的启动文件夹或所有用户的启动文件夹,具体取决于ALLUSERS属性的值。

这意味着当您为“Everyone”(每台机器)安装时,您将获得该文件夹

 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\ 

否则您将在用户的个人资料中显示每用户文件夹。 这是设计的,也是有意义的,因为每用​​户安装没有写入all users文件夹的权限。

在“ 安装和部署”项目中,执行以下操作将文件放入启动文件夹:

  • 打开文件系统视图,
  • 右键单击文件夹树并添加自定义文件夹。
  • 在此文件夹的属性下,将DefaultLocation设置为[StartupFolder]
  • 将内容添加到自定义文件夹

从C ++开始,微软鼓励将SHGetKnownFolderPath与所需的KNOWNFOLDERID枚举值一起使用。 您需要使用的值是FOLDERID_CommonStartMenu 。 在您的情况下,代码看起来像:

 wchar_t * path = nullptr; const auto result = SHGetKnownFolderPath(FOLDERID_CommonStartMenu, 0, NULL, &path); if (S_OK == result) { // do what you want with path, f.ex. create string from it std::wstring pathAsString(path); // according to documentation, calling process is responsible for freeing this resource CoTaskMemFree(path); } 

SHGetKnownFolderPath引用是:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx

enum KNOWNFOLDERID的所有可用值的KNOWNFOLDERID是:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

信息,调用进程负责释放资源,可以在SHGetKnownFolderPath文档中SHGetKnownFolderPath ,部分记录ppszPath参数。

请注意,从服务执行时,某些值不可用(例如,与用户数据相关, FOLDERID_Documents )。 此外,如果使用不同的体系结构,则某些值不可用(与FOLDERID_ProgramFilesX64相关的f.ex.值在32位操作系统上不可用)。

如果有人愿意知道Microsoft鼓励使用SHGetKnownFolderPath而不是其他可用函数,请阅读弃用的SHGetFolderPath文档的顶部。