| 
| 
 | Вопрос # 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 ... отрубаем. Всё.
 Приложение:Переключить в обычный режим Procedure ShutdownComputer;var  ph:THandle;  tp,prevst:TTokenPrivileges;  rl:DWORD;begin  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES orTOKEN_QUERY,ph);  LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);  tp.PrivilegeCount:=1;  tp.Privileges[0].Attributes:=2;  AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl);  ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF,0);end;  
|  | Ответ отправил: Роман (статус: 5-ый класс)Время отправки: 24 февраля 2007, 04:29
 Оценка за ответ: 4
 Комментарий к оценке: Здравствуйте. Мне здесь не сильно понятно где время выставить,ну допустим 6 часовутра. Запустил свою программу
 поставил качать, и спать, а в 6 часов программа отключила бы его. Заранее благодарен.
 |  Ответ #2. Отвечает эксперт: Вадим К В приложении я добавил код для отключения/подключения к интернету.По поводу предыдущего ответа замечу. Так как мы работаем преимущественно под 2000/XP то тут всегда операционка может отказать вашей проге в завершении работы по причине недостаточных привелегий.
 Приложение:Переключить в обычный режим uses   WinInet;  // Causes the modem to automatically dial the default Internet connection. procedure TForm1.Button1Click(Sender: TObject); var   dwConnectionTypes: DWORD; begin   dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN +     INTERNET_CONNECTION_PROXY;   if not InternetGetConnectedState(@dwConnectionTypes, 0) then     // not connected     if not InternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE or       INTERNET_AUTODIAL_FORCE_UNATTENDED, 0) then     begin       // error     end; end;   // hangup the default Internet connection. procedure TForm1.Button2Click(Sender: TObject); var   dwConnectionTypes: DWORD; begin   dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN +     INTERNET_CONNECTION_PROXY;   if InternetGetConnectedState(@dwConnectionTypes, 0) then     // connected     InternetAutodialHangup(0); end; 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 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),и так или иначе это произойдёт,а выключение с точностью до милисекунд и не требуется,и конечно нужен административный вход чтобы небыло проблем с привилегиями...
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |