Форум программистов, компьютерный форум CyberForum.ru

Как добавить программу в автозагрузку? - C++

Восстановить пароль Регистрация
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
23.11.2013, 14:27     Как добавить программу в автозагрузку? #1
Здравствуйте. Мне необходимо добавить свою программу в автозагрузку. Чтобы не было тупых вопросов, вроде: ,,А для чего тебе это? Вирус что ли?,, сразу говорю для чего мне это надо: хочу создать программу, которая через каждые 20 - 30 минут будет сигнализировать, чтобы отдохнуть от компа. И еще подскажите функцию, как выключить компьютер программно. Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2013, 14:27     Как добавить программу в автозагрузку?
Посмотрите здесь:

как добавить звук в программу, C++
как добавить рисунок в программу? C++
Неудается добавить в автозагрузку! C++
как добавить в программу ввод элементов в список. C++
C++ Как добавить класс в программу с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hwmlex
 Аватар для hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
23.11.2013, 14:32     Как добавить программу в автозагрузку? #2
Например, вот так: http://www.faq-howto.ru/computer/kak...ozagruzku.html
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
23.11.2013, 14:37     Как добавить программу в автозагрузку? #3
Цитата Сообщение от anubis1768 Посмотреть сообщение
Как добавить программу в автозагрузку?
Создать REG_SZ-значение в следующем разделе реестра:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
И задать для него путь к своей программе.
Вместо HKLM можно использовать HKCU, тогда автозапуск будет срабатывать только
для данного пользователя. Другой способ - получить путь к папке "Автозагрузка" и
затем создать там ярлык на свою программу.

Цитата Сообщение от anubis1768 Посмотреть сообщение
И еще подскажите функцию, как выключить компьютер программно.
ExitWindowsEx. Для того, чтобы она сработала, потребуется предварительно
включить привилегию SE_SHUTDOWN_NAME, пример есть в MSDN:

How to Shut Down the System
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
23.11.2013, 16:16  [ТС]     Как добавить программу в автозагрузку? #4
Было бы еще интересно посмотреть, как это будет на С++. Какие вообще есть библиотеки для работы с реестром?

Добавлено через 3 минуты
Убежденный, огромное спасибо. Буду разбираться с реестром

Добавлено через 1 час 34 минуты
Убежденный, нашел я простенький класс для работы с реестром, но оно не хочет создавать переменную в реестре. Вот простой пример:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <windows.h>
#include <tchar.h>
#include "w_registry.h"
 
using namespace std;
 
int main()
{
    HKEY hkey = HKEY_LOCAL_MACHINE;
    LPCTSTR SubKey = TEXT("SOFTWARE/Microsoft/Windows/CurrentVersion/Run");
    LPCTSTR ParName = TEXT("ProgramTest");
 
    win_reg::Registry autorun;
    autorun.OpenKey(&hkey, SubKey, false);
 
    TCHAR* WrStr = "d:/Programing/test.exe";
    autorun.SetValueString(ParName, WrStr);
    autorun.CloseKey(hkey);
    
    return 0;
}
w_registry.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef W_REGISTRY_H_INCLUDED
#define W_REGISTRY_H_INCLUDED
#include <iostream>
#include <string.h>
#include <windows.h>
#include <tchar.h>
 
namespace win_reg {
 
class Registry {
private:
    bool pr_is_error;
    HKEY pr_hkey;
    DWORD pr_reserved;
    REGSAM pr_desired;
    DWORD pr_options;
    DWORD pr_type;
    DWORD pr_buffer_size;
    std::string pr_buffer_str;
    void SysGetValue(LPCTSTR a_parname, BYTE* a_buffer, DWORD* a_buf_size);
    void SysSetValue(LPCTSTR a_parname, DWORD a_type, const BYTE* a_value, DWORD a_value_size);
 
public:
    Registry();
    ~Registry();
    void OpenKey(HKEY* a_hkey, LPCTSTR a_subkey, bool a_can_create);
 
    void SetValueString(LPCTSTR a_parname, const TCHAR* a_value);
    void SetValueExpandString(LPCTSTR a_parname, const TCHAR* a_value);
    void SetValueInt(LPCTSTR a_parname, const long* a_value);
    void SetValueFloat(LPCTSTR a_parname, const double* a_value);
 
    std::string GetValueString(LPCTSTR a_parname);
    std::string GetValueExpandString(LPCTSTR a_parname);
    long GetValueInt(LPCTSTR a_parname);
    double GetValueFloat(LPCTSTR a_parname);
 
    void CloseKey(HKEY a_hkey);
    void CloseKey();
};
 
}
 
 
#endif // W_REGISTRY_H_INCLUDED
w_registry.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include "w_registry.h"
 
void win_reg::Registry::SysGetValue(LPCTSTR a_parname, BYTE* a_buffer, DWORD* a_buf_size)
{
    if (!pr_is_error)
    {
        if (RegQueryValueEx(
                pr_hkey,
                a_parname,
                NULL,
                &pr_type,
                NULL,
                &pr_buffer_size) == ERROR_SUCCESS)
            RegQueryValueEx(pr_hkey, a_parname, NULL, &pr_type, (LPBYTE)a_buffer, a_buf_size);
    }
}
 
void win_reg::Registry::SysSetValue(LPCTSTR a_parname, DWORD a_type, const BYTE* a_value, DWORD a_value_size)
{
    if (!pr_is_error)
        pr_is_error = (RegSetValueEx(
            pr_hkey,
            a_parname,
            NULL,
            a_type,
            (BYTE*)a_value,
            a_value_size) != ERROR_SUCCESS);
 
}
 
win_reg::Registry::Registry()
{
    pr_is_error = false;
    pr_reserved = 0;
    pr_desired = KEY_ALL_ACCESS;
    pr_options = REG_OPTION_NON_VOLATILE;
    pr_type = 0;
    pr_buffer_size = 0;
    pr_buffer_str = TEXT("");
}
 
win_reg::Registry::~Registry()
{
 
}
 
void win_reg::Registry::OpenKey(HKEY* a_hkey, LPCTSTR a_subkey, bool a_can_create)
{
    pr_hkey = *a_hkey;
    if (a_can_create)
    {
        pr_is_error = (RegCreateKeyEx(
            pr_hkey,
            a_subkey,
            pr_reserved,
            NULL,
            pr_options,
            pr_desired,
            NULL, &pr_hkey,
            NULL) != ERROR_SUCCESS);
    }
    else
    {
        pr_is_error = (RegOpenKeyEx(
            pr_hkey,
            a_subkey,
            pr_reserved,
            pr_desired,
            &pr_hkey));
    }
}
 
void win_reg::Registry::SetValueString(LPCTSTR a_parname, const TCHAR* a_value)
{
    if (!pr_is_error)
        pr_is_error = (RegSetValueEx(
            pr_hkey,
            a_parname,
            NULL,
            REG_SZ,
            (BYTE*)a_value,
            sizeof(TCHAR)*_tcslen(a_value)) != ERROR_SUCCESS);
}
 
void win_reg::Registry::SetValueExpandString(LPCTSTR a_parname, const TCHAR* a_value)
{
    SysSetValue(a_parname, REG_EXPAND_SZ, (BYTE*)a_value, sizeof(TCHAR)*_tcslen(a_value));
}
 
void win_reg::Registry::SetValueInt(LPCTSTR a_parname, const long* a_value)
{
    SysSetValue(a_parname, REG_DWORD, (BYTE*)a_value, sizeof(long));
}
 
void win_reg::Registry::SetValueFloat(LPCTSTR a_parname, const double* a_value)
{
    SysSetValue(a_parname, REG_BINARY, (BYTE*)a_value, sizeof(double));
}
 
std::string win_reg::Registry::GetValueString(LPCTSTR a_parname)
{
    if (!pr_is_error)
    {
        pr_buffer_str = TEXT("");
        if (RegQueryValueEx(
                pr_hkey,
                a_parname,
                NULL,
                &pr_type,
                NULL,
                &pr_buffer_size) == ERROR_SUCCESS)
            if (pr_type == REG_SZ)
            {
                TCHAR* buffer = new TCHAR[pr_buffer_size];
                RegQueryValueEx(pr_hkey, a_parname, NULL, &pr_type, (LPBYTE)buffer, &pr_buffer_size);
                pr_buffer_str = (const TCHAR*)buffer;
                delete[] buffer;
            }
    }
    return pr_buffer_str;
}
 
std::string win_reg::Registry::GetValueExpandString(LPCTSTR a_parname)
{
    if (!pr_is_error)
    {
        pr_buffer_str = TEXT("");
        if (RegQueryValueEx(
                pr_hkey,
                a_parname,
                NULL,
                &pr_type,
                NULL,
                &pr_buffer_size) == ERROR_SUCCESS)
            if (pr_type == REG_EXPAND_SZ)
            {
                TCHAR* buffer = new TCHAR[pr_buffer_size];
                RegQueryValueEx(pr_hkey, a_parname, NULL, &pr_type, (LPBYTE)buffer, &pr_buffer_size);
                pr_buffer_str = (const TCHAR*)buffer;
                delete[] buffer;
            }
    }
 
    return pr_buffer_str;
}
 
long win_reg::Registry::GetValueInt(LPCTSTR a_parname)
{
    long buffer = 0;
    SysGetValue(a_parname, (LPBYTE)&buffer, &pr_buffer_size);
    return buffer;
}
 
double win_reg::Registry::GetValueFloat(LPCTSTR a_parname)
{
    double buffer = 0;
    SysGetValue(a_parname, (LPBYTE)&buffer, &pr_buffer_size);
    return buffer;
}
 
void win_reg::Registry::CloseKey(HKEY a_hkey)
{
    if (!pr_is_error)
        pr_is_error = (RegCloseKey(a_hkey) != ERROR_SUCCESS);
}
 
void win_reg::Registry::CloseKey()
{
    CloseKey(pr_hkey);
}
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
23.11.2013, 16:37     Как добавить программу в автозагрузку? #5
Цитата Сообщение от anubis1768 Посмотреть сообщение
Какие вообще есть библиотеки для работы с реестром?
А для таких вещей разве нужны какие-то библиотеки ?

Цитата Сообщение от anubis1768 Посмотреть сообщение
нашел я простенький класс для работы с реестром, но оно не хочет создавать переменную в реестре.
Что, прямо так и пишет: "не хочу создавать" ?
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
23.11.2013, 16:39     Как добавить программу в автозагрузку? #6
Цитата Сообщение от anubis1768 Посмотреть сообщение
HKEY hkey = HKEY_LOCAL_MACHINE;
на этот ключ требуются админские права, используй ключ HKEY_CURRENT_USER
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
23.11.2013, 17:04  [ТС]     Как добавить программу в автозагрузку? #7
Цитата Сообщение от Убежденный Посмотреть сообщение
Что, прямо так и пишет: "не хочу создавать" ?
Смотрю в папку, где оно должно создать переменную, но там ничего не создается. То есть, программа запускается, но результата не дает.
fridi, у меня есть админские права. Или нужно как то указать это в самой программе?

Добавлено через 6 минут
fridi, попробовал как ты сказал. Результата 0. Буду пробовать использовать голый WinApi.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2013, 17:17     Как добавить программу в автозагрузку?
Еще ссылки по теме:

Как сделать чтобы программа при первом запуске добавлялась в автозагрузку? C++
C++ Как добавить программу в автозагрузку которой нужны администраторские права
Как добавить программу в автозапуск? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
23.11.2013, 17:17     Как добавить программу в автозагрузку? #8
Цитата Сообщение от anubis1768 Посмотреть сообщение
Смотрю в папку, где оно должно создать переменную, но там ничего не создается.
Код плохой. Нормальный код должен, как минимум, сигнализировать об ошибках, и
если запись в реестр не удалась, то или бросать исключение, или возвращать
определенный числовой код. Кстати, если Windows 64-битная, а программа 32-битная,
то некоторые обращения к реестру будут перенаправляться в ветку Wow6432Node.
Возможно, Вашу "потеряшку" следует искать здесь:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

Цитата Сообщение от anubis1768 Посмотреть сообщение
у меня есть админские права. Или нужно как то указать это в самой программе?
Манифест нужен. С requireAdministrator. А еще нужно проверять, что токен процесса
содержит SID группы "Администраторы", он же S-1-5-32-544. Только в этом случае у
процесса действительно будут полные администраторские права.
Yandex
Объявления
23.11.2013, 17:17     Как добавить программу в автозагрузку?
Ответ Создать тему
Опции темы

Текущее время: 06:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru