|
Вопрос # 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 or
- TOKEN_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),и так или иначе это произойдёт,а выключение с точностью до милисекунд и не требуется,и конечно нужен административный вход чтобы небыло проблем с привилегиями...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|