C# 以编程方式访问所有用户的“开始”菜单
有人知道如何以编程方式访问“所有用户”启动菜单吗 在XP中,位于以下位置:C# 以编程方式访问所有用户的“开始”菜单,c#,.net,setup-deployment,special-folders,C#,.net,Setup Deployment,Special Folders,有人知道如何以编程方式访问“所有用户”启动菜单吗 在XP中,位于以下位置: C:\Documents and Settings\All Users\Start Menu\Programs\Startup C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 在Windows 7中,位于此处: C:\Documents and Settings\All Users\Start Menu\Programs\Startup C:
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
在Windows 7中,位于此处:
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
具体地说,我有一个安装和部署项目,我想在所有用户的启动菜单中设置一个应用程序的快捷方式,以便在任何人登录时启动应用程序
编辑:“所有用户”位于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
C:\>dir”%ALLUSERSPROFILE%\Start Menu“
驱动器C中的音量太棒了
卷序列号为8C57-DB1A
C:\Documents and Settings\All Users\Start菜单目录
2009年12月28日晚上10:27。
2009年12月28日晚上10:27。。
2009年12月28日10:01下午1566 Microsoft Update.lnk
2010年2月23日09:57下午节目
2009年12月28日10:27下午1563设置程序访问和默认值.lnk
2009年12月28日08:51 PM 398 Windows Catalog.lnk
2009年12月28日08:51下午1507 Windows Update.lnk
4个文件5034字节
3个目录64214460416个可用字节
没有为环境的正常方式定义常量。对于所有用户的“开始”菜单,GetFolderPath
,但是您可以使用Win32 APISHGetSpecialFolderPath
来执行此操作:
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();
}
}
您可以使用适当的MSI属性访问启动文件夹(有关更多详细信息,请参阅):
[StartupFolder
]
但是,与依赖于用户的MSI变量一样,此属性指向用户的启动文件夹或所有用户的启动文件夹,具体取决于ALLUSERS属性的值
这意味着当您为“每个人”(每台机器)安装时,您将获得该文件夹
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
否则,您将在用户配置文件中删除每个用户文件夹。这是出于设计,也是有道理的,因为按用户安装将没有写入“所有用户”文件夹的权限
在安装和部署项目中,执行以下操作将文件放入启动文件夹:
- 打开文件系统视图
- 在文件夹树上单击鼠标右键,然后添加自定义文件夹李>
- 在此文件夹的属性下,将DefaultLocation设置为
[StartupFolder]
- 将内容添加到自定义文件夹
- 你也可以试试
string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";
在.NET 4中,
CommonStart菜单
已添加到,因此您可以使用:
Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
< C++ >从微软的编写时刻起,微软鼓励使用<代码> SHGetKnownFolderPath <代码>,希望代码<>代码NoNoFuldIDEnUM。您需要使用的值是
FOLDERID\u commonstart menu
。在您的情况下,代码如下所示:
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的引用是否存在:
enumKNOWNFOLDERID的所有可用值的引用是否存在:
调用进程负责释放资源的信息,可以在SHGetKnownFolderPath
的文档中的部分文档ppszPath
参数中找到
请注意,当从服务执行时,某些值不可用(例如,与用户数据相关,f.ex.FOLDERID\u文档
)。此外,如果您使用的是不同的体系结构,则某些值不可用(例如与FOLDERID\u ProgramFilesX64
相关的值在32位操作系统上不可用)
如果有人想知道Microsoft鼓励在何处使用SHGetKnownFolderPath
而不是其他可用功能,请阅读不推荐使用的SHGetFolderPath
文档顶部。根据安装的Windows的区域设置,这可能不起作用。它实际上在Windows 7上起作用,但是它没有指向启动文件夹。我希望我不必使用Win32 API,但这可以完成工作。从C#使用Win32 API非常常见:)@fre0n:如果你不想使用Win32 API,你可以使用为此目的而制作的MSI属性。完整的引用归于Brian R.Bondy;他按我的措辞回答了这个问题。最后,我在“用户程序菜单”(视图>文件系统)下创建了一个名为“Startup”的文件夹。我依赖于用户安装程序时将“为您自己或使用此计算机的任何人安装”设置为“所有人”。如果用户选择了“Just me”,那么它只会被放在该用户的启动菜单中。我想我可以接受。我想我可以用Brian的方法在自定义操作中复制一个快捷方式……这太棒了,但是,尝试以编程方式访问该文件夹会使您“拒绝访问路径‘C:\Documents and Settings\All Users\Start Menu’”。因此似乎不是很有用。@LogicsaurusRex所说的“access”是指修改文件夹中的项目吗?这肯定需要管理员权限,并且适用于此问题的所有答案,而不仅仅是此问题。在我的情况下,我只是尝试删除应用程序的快捷方式,然后调用“开始”菜单路径上的IO.Directory.GetFiles,但访问被拒绝。似乎在大约一半的情况下,人们希望修改访问权限。只读似乎用处不大。因此,有一条通往某物的道路是一回事,但能够利用它做任何事情又是另一回事。我意识到“使用”路径并不是真正的问题,但下一个逻辑推理将包括使用它,也许还包括修改。