Урок 33 - Автовыключатель компьютера
В этом уроке мы создадим программу под названием "рубильник", она будет выключать наш компьютер по расписанию.
Итак, нам потребуется: 4 Label, 2 Button, DateTimePicker (Win32) и Timer. Располагаем эти компоненты так как на рисунке:
Определимся со свойствами, свойство Kind у DateTimePicker установим в dtkTime, и свойство Enabled у Timer выставляем в False.
Для выключения компьютера служит функция ExitWindowsEx();, но если её написать вот так просто, то ничего не произойдет, она так работала только в Windows98, в более современных системах она работает только когда есть особые привилегия у использующей её программы. Как сделать эти привилегия мы сейчас и узнаем. Для начала создадим процедуру выключения, в разделе Private Form1 объявим процедуру:
... private { Private declarations } Procedure PowerOFF; ...Нажмем комбинацию клавиш Shift + Ctrl + C и Delphi сам создаст шаблон для процедуры, его нужно наполнить кодом:
procedure TForm1.PowerOFF; var TTokenHd: THandle; TTokenPvg: TTokenPrivileges; cbtpPrevious: DWORD; rTTokenPvg: TTokenPrivileges; pcbtpPreviousRequired: DWORD; tpResult: Boolean; const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; begin //=========== Получаем привилегии ==============// begin if Win32Platform = VER_PLATFORM_WIN32_NT then begin tpResult := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TTokenHd); if tpResult then begin tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, TTokenPvg.Privileges[0].Luid); TTokenPvg.PrivilegeCount := 1; TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; cbtpPrevious := SizeOf(rTTokenPvg); pcbtpPreviousRequired := 0; if tpResult then Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg, cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired); end; end; //=============================================// ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0); //Выключаем компьютер; end;Все процедура выключения готова, получилась она довольно громадной, зато везде работает. Теперь займемся таймером, создаем его обработчик события и пишем код:
procedure TForm1.Timer1Timer(Sender: TObject); var a,b: String; begin Label3.Caption:= TimeToStr(GetTime); //Получаем текущее время Label4.Caption:= TimeToStr(DateTimePicker1.Time - GetTime); //Вычисляем сколько времени осталось до выключения a:= TimeToStr(GetTime); //Присваиваем текущее время b:= TimeToStr(DateTimePicker1.Time); //Присваиваем время выключения if a = b then //Если текущее время равно времени выключения то PowerOFF; //выполняем процедуру выключения end;Помните в начале урока мы выключили таймер, сделано это для того, чтобы можно было сначала настроить время а потом запустить таймер. Давайте сделаем управление таймером. Создадим обработчик события OnClick на кнопке "Старт":
procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=True; //Включаем таймер end;Ну и также выключим ,если например ошиблись во времени или передумали, в обработчике на кнопке "Стоп":
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=False; end;
Вот у нас получилась такая программа, осталось изменить свойство Caption у Form1 на "Рубильник" и готово! Будьте осторожней с ней :)
Удачи!
Встретимся в следующем уроке!
Добавил(а): Mattew_Pharrel | Дата: 2014-08-11 | |
Что такое "token", "tHandle", с чем его едят? Где можна найти информацию по таким вещам? Уж больно занятные вещи(ИМХО).
|
Добавил(а): Mattew_Pharrel | Дата: 2014-08-11 | |
И почему два "begin"`a после обьявления "const"?
|
Добавил(а): Dragonfly | Дата: 2015-01-12 | |
Спасибо за урок)
все замечательно, вот только о том как привилегии предоставляются ничего не понял просто скопировал все
Кому интересно вот мое творение по этому уроку - (https://drive.google.com/file/d/0BzKVbXO3LSZ9S1ZNMEtOT0dCSzg/view?usp=sharing)
Сделал что бы отключить можно было только по паролю, который задается при старте, по другому вырубить можно только через диспетчер(не доработки(не знаю как исправить буду рад совету))
|
No results found.