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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
#1

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

23.11.2013, 14:27. Просмотров 868. Ответов 7
Метки нет (Все метки)

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

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

Неудается добавить в автозагрузку! - C++
Привет всем! Такая проблема. Пытаюсь средствами С++ добавить прогу в автозагрузку, в итоге не получается, выдает код ошибки 87, смотрел по...

Как добавить класс в программу с++ - C++
Есть программа работающая с массивами. Подскажите как добавить класс в программу? В с++ я пока не очень понимаю.. только с массивами...

как добавить рисунок в программу? - C++
знаю, что добавляется через меню project -> add resource->bitmap, но эта функция "add resource" неактивная, подскажите как сделать ее...

как добавить звук в программу, - C++
как добавить звук в программу, какие библиотеки и функции

Как добавить программу в автозапуск? - C++
Здравствуйте ребята! Не подскажите, как можно программно добавить мою программу в автозапуск? Желательно скинуть код!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
23.11.2013, 14:32 #2
Например, вот так: http://www.faq-howto.ru/computer/kak...ozagruzku.html
1
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 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
1
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);
}
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
23.11.2013, 16:37 #5
Цитата Сообщение от anubis1768 Посмотреть сообщение
Какие вообще есть библиотеки для работы с реестром?
А для таких вещей разве нужны какие-то библиотеки ?

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

Добавлено через 6 минут
fridi, попробовал как ты сказал. Результата 0. Буду пробовать использовать голый WinApi.
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 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. Только в этом случае у
процесса действительно будут полные администраторские права.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2013, 17:17
Привет! Вот еще темы с ответами:

как добавить в программу ввод элементов в список. - C++
Доброго времени суток , есть программа , которая вводит кол-во елементов в список, и удаляет все елементы. Требуеться сделать добавку...

Написала программу, но не знаю, как анализатор добавить в нее - C++
#include&lt;iostream&gt; int main() { double da, db, dc; char op; std::cout &lt;&lt; &quot;Введите 1 число: &quot;; std::cin &gt;&gt; da; ...

Как сделать чтобы программа при первом запуске добавлялась в автозагрузку? - C++
Как сделать чтобы программа при первом запуске добавлялась в автозагрузку? А потом при каждом запуске ПК, висела в процессах просто, и...

Как добавить библеотеку в программу при её нахождении в одном каталоге? - C++
В чём проблема.Имею задачу которой нужна библиотека(Safe.h).Лежит в одной дериктории с исходником компилю через g++ -O2 Safe.obj main.cpp...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.11.2013, 17:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru