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

Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 00:46     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса #1
Копался в windows.h искал чего нибудь интересного вот и нашел....
Вообщем функция для выключения перезагрузки и завершения сеанса ExitWindowsEx

// выключить компьютер ExitWindowsEx(EWX_SHUTDOWN, 0);
// перезагрузить компьютер ExitWindowsEx(EWX_REBOOT, 0);
// завершить сеанс пользователя ExitWindowsEx(EWX_LOGOFF, 0);
ну и сам загаловочный файл надо подключать <windows.h>
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream.h>
#include <windows.h>         
#include <conio.h>
// только не тестировал я программу xDDD
int main()                   
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
    char c; 
while(1)
  {                               
    system("cls");
    cout<<"1 - Выключить"<<endl<<"2 - Перезагрузка"<<endl<<
    "3 - Завершение сеанса"<<endl<<"0 - Выход"<<endl;
    c = getch();
    if (c == '3')ExitWindowsEx(EWX_LOGOFF, 0);
    if (c == '2')ExitWindowsEx(EWX_REBOOT, 0);
    if (c == '1')ExitWindowsEx(EWX_SHUTDOWN, 0);
    if (c == '0')break;
   }
return 0;                    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2011, 00:46     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса
Посмотрите здесь:

Кому нужен помощник?? C++
C++ Что делает данный код и зачем такое кому-нибудь может понадобиться?
C++ кому не сложно
C++ Удалённое выключение ПК (перевод с Pascal на C++)
Выключение и перезагрузка компа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
26.08.2011, 09:25     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса #2
morphling, разве не нужно вначале получить "права" на выключение компьютера?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
26.08.2011, 13:20     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса #3
>ExitWindowsEx
плохо, не будет работать даже на XP, не говоря про 7

смотреть:
AdjustTokenPrivileges
InitiateSystemShutdownEx
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 17:31  [ТС]     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса #4
у меня XP стоит... я СЕГОДНЯ ночью выключал комп через эту программу и все работало!!!!
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
26.08.2011, 17:57     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса #5
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
#include <iostream>
#include <string>
 
#include <windows.h>
 
using namespace std;
 
struct winapi_exception {
    std::string func_;
    DWORD       code_;
    winapi_exception( const std::string &func, DWORD code)
        :func_(func)
        ,code_(code)
    {}
};
 
struct check_error_t {
    std::string desc_;
    BOOL operator = ( BOOL val ) {
        if( FALSE == val ) 
            throw winapi_exception(desc_, GetLastError());
        return TRUE;
    }
    check_error_t(const std::string & desc)
        :desc_(desc)
    {}
};
 
void set_privilege( HANDLE token,
                    LPCTSTR priv,
                    bool enable )
{
    check_error_t chker("SetPrivilege");
 
    TOKEN_PRIVILEGES tp;
    LUID luid;
    TOKEN_PRIVILEGES tpPrevious;
    DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES);
 
    chker = LookupPrivilegeValue( NULL, priv, &luid );
 
    tp.PrivilegeCount           = 1;
    tp.Privileges[0].Luid       = luid;
    tp.Privileges[0].Attributes = 0;
 
    chker = AdjustTokenPrivileges(
        token,
        FALSE,
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        &tpPrevious,
        &cbPrevious);
 
    tpPrevious.PrivilegeCount       = 1;
    tpPrevious.Privileges[0].Luid   = luid;
 
    if( enable ) {
        tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
    } else {
        tpPrevious.Privileges[0].Attributes ^= 
            (SE_PRIVILEGE_ENABLED & tpPrevious.Privileges[0].Attributes);
    }
    chker = AdjustTokenPrivileges(
        token,
        FALSE,
        &tpPrevious,
        cbPrevious,
        NULL,
        NULL);
}
 
void reboot_pc() {
 
    check_error_t chker("reboot_pc");
    HANDLE _token;
    chker = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &_token );
    set_privilege( _token, SE_SHUTDOWN_NAME, TRUE ); // throw
    chker = InitiateSystemShutdownEx( NULL, NULL, 0, TRUE, TRUE,
        SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_MAINTENANCE | SHTDN_REASON_FLAG_PLANNED );
}
 
 
int main() {
 
    try {
        reboot_pc();
    } catch (const winapi_exception &ex) {
        cout << "Error " << ex.func_ << " Code " << ex.code_ << "\n";
    }
 
    return 0;
}
вот как-то так.
Yandex
Объявления
26.08.2011, 17:57     Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса
Ответ Создать тему
Опции темы

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