Как заставить наше приложение запускаться при запуске компьютера (и, конечно, после того, как пользователь вошел в систему)?
И нет, я не делаю вирус.
Редактирование реестра звучит как хорошая идея?
Моя ОС — Windows 8.
Однако я постараюсь сделать свое приложение доступным для всех возможных ОС Windows.
Правильный способ сделать это — просто добавить ярлык к исполняемому файлу вашего приложения в папку автозагрузки пользователя. Вам не нужно (и не следует) изменять реестр.
Опытные пользователи уже знают, как сделать это вручную, но это также может быть опцией, которую вы хотите предоставить как часть вашего установщика и / или диалогового окна конфигурации в вашем приложении.
Чтобы сделать это из кода C ++, вам нужно сделать две вещи:
Получить местоположение папки запуска текущего пользователя.
Это достигается путем вызова SHGetKnownFolderPath
функция и указание KNOWNFOLDERID
папки, в которой вы заинтересованы. В этом случае это будет FOLDERID_Startup
,
Образец кода:
std::wstring GetStartupFolderPath()
{
PWSTR pszPath;
HRESULT hr = SHGetKnownFolderPath(&FOLDERID_Startup,
0, // no special options required
NULL, // no access token required
&pszPath);
if (SUCCEEDED(hr))
{
// The function succeeded, so copy the returned path to a
// C++ string, free the memory allocated by the function,
// and return the path string.
std::wstring path(pszPath);
CoTaskMemFree(static_cast<LPVOID>(pszPath));
return path;
}
else
{
// The function failed, so handle the error.
// ...
// You might want to throw an exception, or just return an
// empty string here.
throw std::runtime_error("The SHGetKnownFolderPath function failed");
}
}
Обратите внимание, однако, что в то время как SHGetKnownFolderPath
Рекомендуемая функция, она поддерживается только в Windows Vista и более поздних версиях. Если вам нужно поддерживать более старые версии операционной системы, вам нужно будет динамически вызывать ее в более новых версиях, где она доступна, и в противном случае использовать вызов SHGetFolderPath
функция. Этот принимает другой тип идентификатора, CSIDL значение. Тот, который вы хотите, это CSIDL_STARTUP
,
Создайте ярлык для исполняемого файла вашего приложения.
Это достигается с помощью другого набора функций Shell API. Я не буду писать здесь пример кода, потому что все это уже хорошо объяснено на MSDN: Shell Links
Теперь вы просто подключаете точки: когда вы создаете ярлык для исполняемого файла вашего приложения, укажите папку автозагрузки пользователя в качестве пути назначения.
Единственное, о чем нужно знать, это то, что на самом деле существует несколько папок автозагрузки. У каждого пользователя есть тот, который мы получили выше, используя FOLDERID_Startup
, Примерно в 99% случаев это именно то, что вам нужно. Добавление ярлыка к вашему приложению приведет к его автоматическому запуску при входе этого пользователя.
Тем не менее, есть также Глобальный Папка автозагрузки, которая является общей для всех пользователей. Этот определяется FOLDERID_CommonStartup
(или же CSIDL_COMMON_STARTUP
) и требует административных прав для добавления элементов. Это, конечно, имеет смысл, потому что все, что вы положили туда, будет запускаться автоматически, когда любой пользователь входит в систему на компьютере. Только администраторы могут влиять на глобальное поведение, как это. И, скорее всего, вашему приложению это все равно не нужно.
Самое простое решение — разместить .lnk
из .bat
подать в Start Menu\On startup
папка. Это самый простой и не слишком подлый против пользователя.
Другим решением является создание ключа в ключах реестра:
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] //All users
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce] //All users once
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] //Currend user
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce] //Current user once
Это не так прозрачно — так немного агрессивнее по отношению к пользователю.
На окнах вы можете поставить ярлык для вашего приложения в Startup
папку, или вы можете реализовать его в качестве службы.
И что «я не делаю вирус» заставляет вас казаться виновным … Может быть, это кейлоггер? 😉
Есть много способов, но все они зависят от вашей ОС. Для окон взгляните на «Task Schedualer» в разделе «Администрирование» на панели управления.
Может как то так? Обратите внимание, этот фрагмент кода не написан мной.
#include <windows.h>
void Reg() {
::HKEY Handle_Key = 0;
::DWORD Dispoition = 0;
::RegOpenKeyEx( HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
0,
KEY_ALL_ACCESS,
&Handle_Key );
const unsigned char Path[ MAX_PATH ] = "C:\\Windows\\YourProgramName.exe";
::RegSetValueEx( Handle_Key, "My Directory", 0, 1, Path, sizeof( unsigned char ) );
};
Что, вы парни, думаете?