Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 345

/ вопрос открыт /

Ещё раз здравствуйте. Хочу задать ещё вопрос? Можно в Delphi
дать команду кнопке отключить компьютер в то время, какое я укажу. Или хотя бы отключить от интернета в нужное мне время.
Конечно лучше было вобще отключить его.
Заранее благодарен.

Толков Геннадий Викторович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 24 февраля 2007, 03:35
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Роман

Здравствуйте, Толков Геннадий Викторович! Вот код необходимый для завершения работы Windows.А для отключения в заданное время нужно просто сравнивать системное время с заданным:
var NewTime,Sdn:TDateTime; если дата у нас в TEdit, то : Snd:=TimeToStr(Edit1.Text); теперь в Sdn у нас время когда мы хотим выключить комп. И по Timer1Timer проверяем: NewTime:=New; if (Sdn-NewTime)< 0 then ... отрубаем. Всё.

Приложение:
  1. Procedure ShutdownComputer;
  2. var
  3. ph:THandle;
  4. tp,prevst:TTokenPrivileges;
  5. rl:DWORD;
  6. begin
  7. OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or
  8. TOKEN_QUERY,ph);
  9. LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
  10. tp.PrivilegeCount:=1;
  11. tp.Privileges[0].Attributes:=2;
  12. AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);
  13. ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF,0);
  14. end;
  15.  
  16.  


Ответ отправил: Роман (статус: 5-ый класс)
Время отправки: 24 февраля 2007, 04:29
Оценка за ответ: 4

Комментарий к оценке: Здравствуйте. Мне здесь не сильно понятно где время выставить,ну допустим 6 часов
утра. Запустил свою программу
поставил качать, и спать, а в 6 часов программа отключила бы его. Заранее благодарен.

Ответ #2. Отвечает эксперт: Вадим К

В приложении я добавил код для отключения/подключения к интернету.
По поводу предыдущего ответа замечу. Так как мы работаем преимущественно под 2000/XP то тут всегда операционка может отказать вашей проге в завершении работы по причине недостаточных привелегий.

Приложение:
  1. uses
  2. WinInet;
  3.  
  4. // Causes the modem to automatically dial the default Internet connection.
  5. procedure TForm1.Button1Click(Sender: TObject);
  6. var
  7. dwConnectionTypes: DWORD;
  8. begin
  9. dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN +
  10. INTERNET_CONNECTION_PROXY;
  11. if not InternetGetConnectedState(@dwConnectionTypes, 0) then
  12. // not connected
  13. if not InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE or
  14. INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) then
  15. begin
  16. // error
  17. end;
  18. end;
  19.  
  20.  
  21. // hangup the default Internet connection.
  22. procedure TForm1.Button2Click(Sender: TObject);
  23. var
  24. dwConnectionTypes: DWORD;
  25. begin
  26. dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN +
  27. INTERNET_CONNECTION_PROXY;
  28. if InternetGetConnectedState(@dwConnectionTypes, 0) then
  29. // connected
  30. InternetAutodialHangup(0);
  31. end;
  32.  


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 24 февраля 2007, 17:00
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 25 февраля 2007, 07:44; участников в обсуждении: 3.
Роман

Роман (статус: 5-ый класс), 24 февраля 2007, 06:27 [#1]:

Sorry там опечатка: не New a Now.
Роман

Роман (статус: 5-ый класс), 24 февраля 2007, 08:02 [#2]:

Блин,ночью надо спать!
... И по Timer1Timer проверяем:
if Edit1.Text=TimeToStr(now) then ... отрубаем...
Или просто заменить TimetoStr на StrToTime.
Интервал таймера 1000.
Толков Геннадий Викторович

Толков Геннадий Викторович (статус: Посетитель), 25 февраля 2007, 01:32 [#3]:

Здравствуйте. Мне здесь не сильно понятно где время выставить,ну допустим 6 часов
утра. Запустил свою программу
поставил качать, и спать, а в 6 часов программа отключила бы его. Заранее благодарен.
Вадим К

Вадим К (статус: Академик), 25 февраля 2007, 02:32 [#4]:

Роман, так делать, как вы рекомендуете, я не советую, так как скорее всего время совадать будет очень редко. Вы изучали сравнение вещественных чисел?
Как же сделать.
Ставим таймер, который будет тикать каждую минуту.
Заводим глобальные переменные
IsTaskRun:boolean;
TaskTime:TDateTime;
Для кнопки установить время
TaskTime:=DateTimePicker1.Date+DateTimePicker2.time;
IsTaskRun:=false;

в обработчике таймера
if (Now begin
IsTaskRun:=False;
ShutdownComputer;
end;

И не забыть поставить на форму два компонента
TDateTimePicker. У второго переключить свойство Kind
Галочка "подтверждения прочтения" - вселенское зло.
Роман

Роман (статус: 5-ый класс), 25 февраля 2007, 07:27 [#5]:

Время задаётся в поле Edit1,у меня например оно вообще задаётся через командную строку.И кстати по поводу редкого совпадения: у маня работает без проблем.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (CheckBox1.Checked)and(Edit1.Text=TimeToStr(now))then
begin
ShutdownComputer;
Halt;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:=TimeToStr(now);
if ParamCount>0 then
begin
Edit1.Text:=ParamStr(1);
CheckBox1.Checked:=true;
Application.ShowMainForm:=false;
end;
end;
Роман

Роман (статус: 5-ый класс), 25 февраля 2007, 07:37 [#6]:

Хотя лучше конечно указать Edit1.Text
Роман

Роман (статус: 5-ый класс), 25 февраля 2007, 07:40 [#7]:

Sorry проблемы сети,ещё раз.
Хотя лучше конечно указать Edit1.Text
Роман

Роман (статус: 5-ый класс), 25 февраля 2007, 07:44 [#8]:

Ещё раз sorry:)
Хотя лучше конечно проверять когда
Edit1.Text станет меньне TimeToStr(now),и так или иначе это произойдёт,а выключение с точностью до милисекунд и не требуется,и конечно нужен административный вход чтобы небыло проблем с привилегиями...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:46
Выполнено за 0.02 сек.