以编程方式访问所有用户开始菜单
有谁知道如何以编程方式访问“所有用户”启动菜单?
在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
文档的顶部。