12

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

在 XP 中,位于此处:

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

在 Windows 7 中,位于此处:

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

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

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

4

6 回答 6

21

在 .NET 4CommonStartMenu中添加了Environment.SpecialFolderenum,因此您可以使用:

Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
于 2012-03-30T06:19:22.170 回答
18

没有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();
    }
}
于 2010-02-24T21:29:42.980 回答
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
于 2010-02-24T21:29:10.500 回答
4

你也可以试试!

string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";
于 2011-09-25T16:45:00.393 回答
2

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

但是,与用户相关的 MSI 变量一样,此属性指向用户的启动文件夹或所有用户的启动文件夹,具体取决于 ALLUSERS 属性的值。

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

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

否则,您将在用户的个人资料中创建每个用户的文件夹。这是设计使然,也很有意义,因为按用户安装将无权写入所有用户文件夹。

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

  • 打开文件系统视图,
  • 右键单击文件夹树并添加自定义文件夹。
  • 在此文件夹的属性下,将DefaultLocation设置为[StartupFolder]
  • 将内容添加到自定义文件夹
于 2010-02-24T22:11:54.677 回答
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

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

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

如果有人愿意知道 Microsoft 鼓励在哪里使用SHGetKnownFolderPath而不是其他可用功能,请阅读 deprecated 文档的顶部SHGetFolderPath

于 2016-11-17T13:48:27.753 回答