Adjusttokenprivileges
Автор Huntsman задал вопрос в разделе Другие языки и технологии
Помогите написать программу выключения компьютера на С++ и получил лучший ответ
Ответ от Yaroslav429[эксперт]
Держи функцию) (сразу предупреждаю - сдесь (на ответах) код курочиться, поэтому если нужен готовый отлаженый исходник - пиши на мыло) Я когда-то такой фигней тоже маялся)bool shoot(bool reboot, bool force){OSVERSIONINFO ver;ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&ver);if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) { HANDLE hToken; TOKEN_PRIVILEGES* NewState; OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken); NewState=(TOKEN_PRIVILEGES*)malloc(sizeof(TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES)); NewState->PrivilegeCount = 1; LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&NewState->Privileges[0].Luid); NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, NewState, NULL, NULL,NULL); free(NewState); CloseHandle(hToken); }UINT mode = 0;if (reboot) mode += EWX_REBOOT;else mode += EWX_POWEROFF;if (force) mode += EWX_FORCE;return ExitWindowsEx(mode, 0);}Использование :shoot(false,true); - форсированное выключение без запроса о сохранении документовshoot(true,false); - перезагрузкаshoot(false,false); - простое выключение с запросом о сохранении документовСтавишь на таймер, и все)Вот пример таймера (обработчик)Определяем int k и задаем ей количество секунд, через сколько выключать.например пишешь int k=60;В таймере (интервал 1 секунда) :k--;AnsiString chas,min,sec; // не обязательно) )chas = k/3600; // не обязательно) )min = k/60-chas*60; // не обязательно) )sec = k % 60; // не обязательно) )Button1->Caption = chas + " : " + min + " : " + sec; // не обязательно) )if(k==0) { Timer1->Enabled = false; shoot(false,true); Close(); }Как, наверное, стало понятно - 60 секунд и форсированное выключение)))
Ну ты сам же и ответил на свой вопрос! Создай таймер, и через определенный интервал вызови утилиту shutdown с выбранными параметрами!И не важно на чем программишь. Вся прога - пара вызовов WinApi
вот тебе и ответ. Кулер все объяснил. Если хочешь чтобы утилитка напрямую работала то пиши на Асме ИМХО. А самая прикольная вещь это будильник спаянный с рубильником, безотказная вещь 🙂
ShellExecute nебе в помощь.