Программный доступ ко всем пользователям меню Пуск
Кто-нибудь знает, как программно получить доступ к меню запуска "все пользователи"?
В XP, расположенном здесь:
C:Documents and SettingsAll UsersStart MenuProgramsStartup
И в Windows 7, расположенной здесь:
C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup
В частности, у меня есть проект установки и развертывания, и я хотел бы поместить ярлык приложения в меню запуска для всех пользователей, чтобы приложение запускалось всякий раз, когда кто-либо входит в систему.
EDIT: я почти уверен, что именно здесь Брайан получил свой ответ.
6 ответов:
Нет константы, определенной для обычного способа
Environment.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(); } }
В .NET 4
CommonStartMenu
был добавлен кEnvironment.SpecialFolder
enum , так что вы можете использовать:Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
"All Users" находится в переменной окружения 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
Вы также можете попробовать!
string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";
Вы можете получить доступ к папке запуска с помощью соответствующего свойства MSI (смотрите здесь для получения более подробной информации):
[StartupFolder
]Однако, как обычно для зависимых от пользователя переменных MSI, это свойство указывает либо на папку запуска пользователя, либо на папку запуска всех пользователей, в зависимости от значения свойства ALLUSERS.
Это означает, что при установке для "всех" (для каждой машины) вы получите папку
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
В противном случае пользовательская папка будет находиться в папке пользователя. профиль. Это по замыслу и также имеет смысл,так как установка для каждого пользователя не будет иметь разрешения на запись в папку all users.
В вашем проекте установки и развертывания выполните следующие действия, чтобы поместить файлы в папку запуска:
- откройте представлениефайловой системы ,
- щелкните правой кнопкой мыши дерево папок и добавьте пользовательскую папку.
- в свойствах этой папки задайте DefaultLocation в
[StartupFolder]
- добавить содержимое в пользовательскую папку
Из C++, Что касается момента написания этого, Microsoft рекомендует использовать
SHGetKnownFolderPath
с желаемым значениемKNOWNFOLDERID
enum. Значение, которое вам нужно использовать, -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
является there:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs. 85).aspxСсылка на все доступные значения перечисления
Информацию о том, что вызывающий процесс отвечает за высвобождение ресурса, можно найти в документации по параметруKNOWNFOLDERID
является there:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs. 85).aspxSHGetKnownFolderPath
in part documentingppszPath
.Обратите внимание, что при его выполнении из сервиса некоторые значения недоступны (например, связанные с данными пользователя, например:
FOLDERID_Documents
). Кроме того, если некоторые значения недоступны, если вы используете другую архитектуру (например. значение, относящееся кFOLDERID_ProgramFilesX64
, недоступно в 32-разрядной операционной системе).Если кто-то хочет знать, где Microsoft рекомендует использовать
SHGetKnownFolderPath
вместо других доступных функций, пожалуйста, прочитайте верхнюю часть документации устаревшегоSHGetFolderPath
.