有谁知道如何以编程方式访问“所有用户”启动菜单?
在XP中,位于此处:
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
在Windows 7中,位于此处:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
具体来说,我有一个安装和部署项目,我想在所有用户的Startup菜单中为应用程序添加一个快捷方式,以便每当有人登录时启动应用程序。
答案 0 :(得分:20)
在.NET 4中,CommonStartMenu
添加了Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
,因此您可以使用:
{{1}}
答案 1 :(得分:17)
对于所有用户的开始菜单,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();
}
}
答案 2 :(得分:4)
“所有用户”驻留在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 <DIR> .
12/28/2009 10:27 PM <DIR> ..
12/28/2009 10:01 PM 1,566 Microsoft Update.lnk
02/23/2010 09:57 PM <DIR> 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
答案 3 :(得分:3)
你也可以尝试!
string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";
答案 4 :(得分:2)
您可以使用适当的MSI属性访问启动文件夹(有关详细信息,请参阅here):[StartupFolder
]
但是,对于依赖于用户的MSI变量,此属性通常指向用户的启动文件夹或所有用户的启动文件夹,具体取决于ALLUSERS属性的值。
这意味着当您为“Everyone”(每台机器)安装时,您将获得文件夹
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
否则您将在用户的个人资料中显示每个用户的文件夹。这是设计的,也是有意义的,因为每用户安装没有写入all users文件夹的权限。
在设置和部署项目中,执行以下操作将文件放入启动文件夹中:
[StartupFolder]
答案 5 :(得分:0)
从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
枚举KNOWNFOLDERID
的所有可用值的引用是:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
Info,调用流程负责释放资源,可以在SHGetKnownFolderPath
的文档中找到,部分记录ppszPath
参数。
请注意,从服务执行时,某些值不可用(例如,与用户数据相关,f。FOLDERID_Documents
)。此外,如果使用不同的体系结构,则某些值不可用(与FOLDERID_ProgramFilesX64
相关的f.ex.值在32位操作系统上不可用)。
如果有人愿意知道Microsoft鼓励使用SHGetKnownFolderPath
而非其他可用功能的位置,请阅读已弃用SHGetFolderPath
的文档顶部。